web-dev-qa-db-ja.com

TomcatHTTPSキーストア証明書

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

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

信頼できる証明書として追加:
件名:CN = A 
発行者:CN = A 
アルゴリズム:RSA;シリアル番号:-
 2009年11月10日火曜日14:48:31CET2010から2010年2月8日月曜日14:48:31CET 
 
信頼できる証明書として追加:
件名:X 
発行者:X 
アルゴリズム:RSA;シリアル番号:-
 2005年1月19日水曜日01:00:00CET2005から2015年1月19日月曜日00:59:59まで有効

実際の値をプレースホルダーに置き換えました。 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インスタンスが正しい証明書を提示しない理由はありますか?

19
tmbrggmn

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

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

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

私がうまくいくとわかった解決策は次のとおりです。

  1. 既存の証明書を変換しますandその秘密鍵を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番目)のパラメーターがあるようにしました。

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

15
tmbrggmn

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

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

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

3
Bozho

@Bozhoコメントを拡張して、

これは本当に重要でした。 "キーと購入した証明書は同じエイリアスになります"

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

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

2
SayeedHussain