18

SSLとTomcatを使用して別の問題が発生しました。キーと証明書(サイトに接続しているクライアントに提示したいサーバー証明書)を含むキーストアを構成しました。トラストストアについても同じことを行いました(クライアント認証が必要になります)。

私が今抱えている問題は、HTTPS経由でTomcatインスタンスに接続するときに、提示される証明書(サーバー証明書)が実際のサーバー証明書ではなく、JKSキーストアのキーであるということです-Djavax.net.debug = sslを使用すると、クライアント認証に正しいCAが提示されているが、正しいサーバー証明書は提示されていないことがわかります。

信頼できる証明書として追加:
  件名:CN = A
  発行者:CN = A
  アルゴリズム:RSA; シリアルナンバー: -
  2009年11月10日火曜日14:48:31CETから2010年2月8日月曜日14:48:31CETまで有効

信頼できる証明書として追加:
  件名:X
  発行者:X
  アルゴリズム:RSA; シリアルナンバー: -
  2005年1月19日水曜日01:00:00CET2005から2015年1月19日月曜日00:59:59CETまで有効

実際の値をプレースホルダーに置き換えました。A =サーバーのドメイン名(ただし、この場合、何らかの理由でこれがキーであり、証明書ではありません)。X = VeriSign CA(これは正しいはずです)。クライアントに提示するために使用したい既存の証明書があり、keytoolを使用してJKSキーストアにインポートしました。

Tomcatコネクタ構成:

<Connector port="444" protocol="HTTP/1.1" SSLEnabled="true"
  maxThreads="150" scheme="https" secure="true"
  clientAuth="false" sslProtocol="TLS"     
  keystoreFile="conf/ssl/keystore.jks"
  keystorePass="xx"
  keyAlias="testkey"
  truststoreFile="conf/ssl/truststore.jks"
  truststorePass="xx" />

Tomcatインスタンスが正しい証明書を提示しない理由はありますか?

4

3 に答える 3

15

問題は (どうやら - これを実際に確認することはできません)、以前に生成された証明書 (および一致するキー) を JKS キーストアに適切にインポートし、それを Tomcat によって適切に提示することができないことです。

私の問題が発生した状況は次のとおりです。

  1. OpenSSL を使用して最初から生成した証明書ファイル (キー + CSR -> 証明書) があり、自分の CA によって署名されています。
  2. サイトに接続しているユーザーにこの特定の証明書を提示するように、Tomcat を構成したいと考えています。

私が見つけた解決策は次のとおりです。

  1. 既存の証明書その秘密鍵を DER 形式に変換します。例 (OpenSSL を使用):

    秘密鍵の場合;

    openssl pkcs8 -topk8 -nocrypt -in my_private_key.key -inform PEM -out my_private_key.der -outform DER

    実際の署名付き証明書の場合;

    openssl x509 -in my_certificate.crt -inform PEM -out my_certificate.der -outform DER

  2. カスタム Java クラスを使用して、両方の DER ファイルをキーストア (JKS ファイル) にインポートします。

    java ImportKey my_private_key.der my_certificate.der

    私はこれを自分で理解していませんでした (すべての功績は最初の発明者にあります)。この Java クラスのソースと詳細については、ここここを参照してください。結果の JKS ファイルの出力場所を指定する 3 番目 (または 4 番目) のパラメーターがあるように、このクラスを少し変更しました。

最終結果は、Tomcat コネクタ構成でキーストアとして使用できる JKS キーストアです。上記のツールは、キーと JKS ファイル自体のデフォルトのパスワードを使用して JKS ファイルを生成します。これらは後で と を使用して変更できkeytool -storepasswdますkeytool -keypasswd。これが同じ問題に直面している人々に役立つことを願っています。

于 2010-01-13T16:52:35.847 に答える
3

構成は正しく機能するはずです。

Tomcatのハウツーでは、適切なJKSを取得するために実行する手順について説明しています。

適切なエイリアス(testKey)を使用して証明書をjksにインポートしたことを確認してください

于 2010-01-13T09:21:46.980 に答える
2

@Bozho コメントを拡張すると、

これは非常に重要でした。「キーと購入した証明書は同じエイリアスの下にある必要があります」 .

CA (Verisign、Digicert など) から購入した SSL 証明書は、csr を作成する前に生成された秘密鍵と同じエイリアスでインポートする必要があります。購入した証明書を Java keytool を使用してキーストアにインポートすると、「証明書の返信がキーストアに追加されました」と表示されます。

信頼チェーンを確認するには、端末コマンドopenssl s_client -connect yourdomain.com:443 -showcerts を使用します。それはあなたの証明書から始まり、信頼できるルート CA につながります。

于 2014-05-31T18:06:30.817 に答える