web-dev-qa-db-ja.com

java.lang.Exception:返信とキーストアの公開キーが一致しません

ポート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エラー:Java.lang.Exception:返信とキーストアの公開キーが一致しません

私はすでにSOで検索を行っていますが、これまでのところ運はありません。

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

編集:---

証明書のインポート順序を変更してテストしましたが、これまでのところ運はありません。

11
RE350

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

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

SSL証明書が完全に異なるキーペアに対して生成されたため、手順4は失敗します。

3つの証明書はおそらく次のとおりです。

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

ここで必要なのは、トラストストアにトラストアンカーを追加することです(デフォルトでは${Java_HOME}/jre/lib/security/cacerts)、クライアントがWebサービスのSSL証明書を受け入れる結果。

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

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

WebサービスでSSLクライアント認証が必要な場合は追加の手順が必要ですが、クライアント認証については一度も言及したことがないので、それは必要ないと思います。

16
Omikron

ここでの問題は、JKSストアの作成中に使用したものと同様の証明書のインポート中に使用したエイリアスです。エイリアスを変更するだけで問題が解決します。ソースドキュメント[1]は、それに応じて修正する必要があります。

[1] http://docs.Oracle.com/cd/E19509-01/820-3503/ggfgo/index.html

33

証明書をインポートする4つのポイント(エラーが発生する場所:keytool error:Java.lang.Exception:返信とキーストアの公開キーが一致しません)で、エイリアスを変更してください。キーストアのエイリアスにすでに使用されているため、エイリアスはnpci_client_testoreであってはなりません。

7

私の場合、「CAに署名したルート証明書」がチェーンにありませんでした。適切なルートCA証明書があるかどうかを確認してください。そうでない場合は、中間CAからエクスポートして、キーストアにインポートします。ルートCAをキーストアにインポートするとうまくいきました。

3
azhar buttar

Tomcat8でホスティングしているのと同じ例外エラー(キーストアが一致しません)がありました。キーストアの作成中にwrong domain nameまたはno domain nameを入力した場合は、キーストアファイルを再作成し、CSRをライセンス/認識/承認した認証機関(CA)に再送信する必要があります。デジタル署名証明書(私の場合はGodaddy)を発行します。

キーストアファイルを作成するコマンドは次のとおりです。

keytool -keysize 2048 -genkey -alias Tomcat -keyalg RSA -keystore Tomcat.keystore
keytool -importkeystore -srckeystore Tomcat.keystore -destkeystore Tomcat.keystore -deststoretype pkcs12

ドメイン名を入力する必要があります。プロンプトが姓と名を要求するとき、それはを要求しています完全修飾ドメイン名(FDQN)例:www.example.com)。市、州、県から-do not abbreviate

次のコマンドを入力してCSRを作成します(Tomcat.keystoreの場所と同じディレクトリから)。

keytool -certreq -keyalg RSA -alias Tomcat -file myFQDN.csr -keystore Tomcat.keystore

注:以前のエラーのため、WindowsコンソールからGodaddy証明書をすべて削除する必要がありました( [〜#〜] mmc [〜#〜] )。

証明機関から証明書ファイルの準備ができたら。ファイルをダウンロードし、2つの.crtファイルをそれぞれダブルクリックして、Windowsに再インストールします(ローカルマシンに自動的にインストールすることを選択します)。 Tomcat.keystoreファイルをバックアップしてから、これらの証明書ファイルをORDERからTomcat.keystoreファイルに(最初から)同じ順序でインポートします。次の例:

keytool -import -alias root -keystore Tomcat.keystore -trustcacerts -file gdig2.crt.pem
keytool -import -alias intermed -keystore Tomcat.keystore -trustcacerts -file Gd_bundle-g2-g1.crt
keytool -import -alias Tomcat -keystore Tomcat.keystore -trustcacerts -file namewithnumbersandletters.crt

Server.xmlを更新したことを確認してから、Tomcatを再起動します

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="443" />  
    <Connector 
    URIEncoding="UTF-8"
    SSLEnabled="true" 
    clientAuth="false"
    keystoreFile="C:\Program Files\Java\jdk1.8.0_181\bin\Tomcat.keystore" 
    keystorePass="changeme" 
    maxThreads="200" 
    port="443" 
    scheme="https" 
    secure="true" 
    sslProtocol="TLS" />

ほら!ドメインを参照すると、ロックされたアイコン(セキュア接続)が表示されます。

1
QA Specialist

これは私のために働いた:

keytool -keystore yourkeystorename -importcert -alias certificatealiasname -file certificatename.cer
0
guest98