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インスタンスが正しい証明書を提示しない理由はありますか?
問題は(明らかに、これを実際に確認することはできません)、以前に生成された証明書(および一致するキー)をJKSキーストアに適切にインポートして、Tomcatによって適切に提示することが不可能であるということです。
私の問題が発生した状況は次のとおりです。
私がうまくいくとわかった解決策は次のとおりです。
既存の証明書を変換します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
カスタムJavaクラスを使用して、両方のDERファイルをキーストア(JKSファイル)にインポートします。
Java ImportKey my_private_key.der my_certificate.der
私はこれを自分で理解していませんでした(すべてのクレジットは元の発明者にあります)。このJavaクラスのソース、およびいくつかの詳細はここにあります ここ =および ここ 。このクラスを少し変更して、結果のJKSファイルの出力場所を指定する3番目(または4番目)のパラメーターがあるようにしました。
最終結果はJKSキーストアであり、Tomcatコネクタ構成でキーストアとして使用できます。上記のツールは、キーとJKSファイル自体のデフォルトのパスワードを使用してJKSファイルを生成します。これらは、後でkeytool -storepasswd
とkeytool -keypasswd
を使用して変更できます。これが同じ問題に直面している人々に役立つことを願っています。
構成は正しく機能するはずです。
Tomcatのハウツー 適切なJKSを取得するために実行する手順について説明します。
適切なエイリアス(testKey)を使用して証明書をjksにインポートしたことを確認してください
@Bozhoコメントを拡張して、
これは本当に重要でした。 "キーと購入した証明書は同じエイリアスになります"。
CAから購入したSSL証明書(Verisign、Digicertなど)は、csrを作成する前に生成された秘密鍵と同じエイリアスでインポートする必要があります。 Java keytoolを使用して、購入した証明書をキーストアにインポートすると、"証明書の応答がキーストアに追加されました"。が表示されます。
信頼チェーンを確認するには、ターミナルコマンドを使用しますopenssl s_client -connect yourdomain.com:443 -showcerts。証明書から始まり、信頼できるルートCAにつながります。