1

このコマンドを使用してCSRリクエストを作成しました:

openssl req -out certificatecsr.csr -new -newkey rsa:2048 -keyout certificatekey.key

その後、CA は証明書 (.cer) ファイルを私と共有しました。

その後、キーを使用して.cerファイルを.p12に変換しました。

CA から送信された cer と秘密鍵を使用して .p12 証明書を作成する

C:\Java\jdk1.6.0_38\jre\bin>openssl pkcs12 -export -in C:\Users\ashharma1\cert.cer -inkey certificatekey.key -out

certi.p12

JKS キーストアの作成:

keytool -genkey -alias quid -keystore quid.jks

.p12 証明書を jks キーストアにインポートしています

C:\Java\jdk1.6.0_38\jre\bin>keytool -v -importkeystore -srckeystore C:\OpenSSL-Win64\bin\certi.p12 -srcstoretype PKCS12

-destkeystore quid.jks -deststoretype JKS

しかし、JavaコードからこのJKSを参照していると、次のエラーが発生します:

sun.security.validator.ValidatorException: PKIX パスの構築に失敗しました:

sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりません

cer ファイルも cacerts. に追加しましたが、それでも同じエラーが発生します。

JAVAコードに関する限り、私はこのリンクを参照して、自分で作成したキーストアを参照しています:

http://jcalcote.wordpress.com/2010/06/22/managing-a-dynamic-java-trust-store/

public SSLContext getSSLContext(String tspath) 
        throws Exception {

      TrustManager[] trustManagers = new TrustManager[] { 

        new ReloadableX509TrustManager(tspath) 
      };
      SSLContext sslContext = SSLContext.getInstance("TLS");

      sslContext.init(null, trustManagers, null);

      return sslContext;

    }

SSLContext sslContext=getSSLContext("C:\\Java\\jdk1.6.0_38\\jre\\bin\\quid.jks");
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
URL pickUrl = new URL(pickupLocation);
URLConnection urlConn = pickUrl.openConnection();
HttpsURLConnection httpsURLConn = (HttpsURLConnection)urlConn;
httpsURLConn.setSSLSocketFactory(socketFactory);
String encoding = urlConn.getContentEncoding();   
InputStream is = urlConn.getInputStream();    
InputStreamReader streamReader = new InputStreamReader(is, encoding != null
? encoding : "UTF-8");

私はサーバーを使用していないことに注意してください。上記のコードをメインメソッドのみで実行しようとしています。

何をする必要があるか教えてください。.cer ファイルを .p12 ファイルに変換する必要があるのはなぜですか?

4

2 に答える 2

2

CA 証明書 (または CA と中間 CA のチェーン全体) をキーストアにインポートすることをお勧めします。

p12 は正常にインポートされたと思います。私が提案しているのは、キーストアへのチェーンのインポートです。少なくともそれがエラーメッセージが言っていることです。

私はそれを推測します:

  • チェーンのルート CA が信頼されていないため、チェーンの構築が失敗するか、
  • チェーン内の証明書に AIA セクションがないため、信頼できるルート CA までの証明書を取得できないため、チェーンの構築が失敗するか、
  • AIA は Java で実装されていないため (私は Java プログラマーではありません)、証明書は AIA に基づいてフェッチされていないため、チェーンの構築に失敗します。

portecleを使用して、不足している信頼できる CA 証明書をインポートできます (.p12 または CA の発行から受け取った別の .cer ファイルにあるエンド エンティティの証明書ではありません)。keytool よりも使いやすいです。このガイドに従ってください。

于 2014-07-15T07:39:47.733 に答える