1. ホーム
  2. java

[解決済み] [Solved] java.lang.Exception: replyとkeystoreの公開鍵が一致しない

2022-01-27 02:24:58

質問

私はポート443でホストされているWebサービスにアクセスする必要があります。サービスプロバイダは、私たちと3つの証明書を共有しています。

  1. ABCD.cer
  2. CA_Certificate.cer
  3. CCA_Certificate.cer

SSL通信のためのフォームチェーンを作成し、キーストアに追加する必要があります。

  1. keytool -keystore npci_keystore_test.jks -genkey -alias npci_client_testore

       Result :- keystore npci_keystore_test.jks created.
    
    
  2. keytool -import -keystore npci_keystore_test.jks -file CA_Certificate.cer -alias theCARoot

       Result :- certificate CA_Certificate.cer is added to keystore.
    
    
  3. keytool -import -keystore npci_keystore_test.jks -file CCA_Certificate.cer -alias theCCARoot

       Result :- certificate CCA_Certificate.cer is added to keystore.
    
    
  4. keytool -import -keystore npci_keystore_test.jks -file ABCD.cer -alias npci_client_testore

    ステップ4で以下のような例外が発生しました。

    キーストア パスワードを入力してください: (パスワードを入力すると、以下の例外が発生します)

    keytool error: java.lang.Exception: replyとkeystoreの公開鍵が一致しません。

SOで検索しましたが、今のところヒットしません。

私は以下のソースに従ってストアを作成し、そこに証明書をインポートしています。 JKSキーストア

EDIT:---

証明書のインポート順序を変えてテストしてみましたが、今のところうまくいきません。

どうすればいいですか?

ご質問のリンク先では、サーバー用のSSLキーストアを作成する方法を説明していますが、これはあなたがやりたいことではありません。あなたがしたことは

  1. 新しいキーペアを作成する
  2. 鍵ストアに信頼できる証明書を追加する
  3. 別の信頼できる証明書をキーストアに追加する
  4. サーバーのSSL証明書をキーペアの証明書としてインポートしてみる

ステップ4は、SSL証明書が全く別のキーペアのために生成されたため、失敗しました。

3つの証明書は、おそらく

  1. ウェブサービスのSSL証明書
  2. SSL証明書に署名したCA証明書
  3. CAに署名したルート証明書

今やらなければならないことは、トラストストアにトラストアンカーを追加することです(デフォルトでは。 ${JAVA_HOME}/jre/lib/security/cacerts その結果、クライアントはウェブサービスのSSL証明書を受け入れることになります。

通常、SSLサーバはSSLハンドシェイクの際にルート証明書を除くチェーン全体をクライアントに送信します。これは、ルート証明書をトラストストアに追加する必要があることを意味します。

keytool -import -keystore ${JAVA_HOME}/jre/lib/security/cacerts -file CCA_Certificate.cer -alias theCCARoot

ウェブサービスがSSLクライアント認証を必要とする場合は、追加の手順が必要ですが、クライアント認証について言及されていないので、必要ないと思われます。