Tomcat HTTPSキーストア証明書
質問
SSLとTomcatを使用して別の問題に遭遇しました。キーと証明書(サイトに接続するクライアントに提示するサーバー証明書)を含むキーストアを構成しました。 TrustStoreについても同じことをしました(クライアント認証が必要になります)。
私が今持っている問題は、HTTPSを介してTomcatインスタンスに接続するとき、私に提示された証明書(サーバー証明書)は私の実際のサーバー証明書ではなく、むしろ 鍵 JKSキーストアで。 -djavax.net.debug = sslを使用すると、クライアント認証に正しいCAを提示しているが、正しいサーバー証明書ではないことが明らかになりました。
adding as trusted cert: Subject: CN=A Issuer: CN=A Algorithm: RSA; Serial number: - Valid from Tue Nov 10 14:48:31 CET 2009 until Mon Feb 08 14:48:31 CET 2010 adding as trusted cert: Subject: X Issuer: X Algorithm: RSA; Serial number: - Valid from Wed Jan 19 01:00:00 CET 2005 until Mon Jan 19 00:59:59 CET 2015
実際の値を場所の所有者に置き換えました。 a =サーバーのドメイン名(ただし、この場合、何らかの理由でこれが鍵であり、証明書ではありません)。 x = a 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が適切に提示することは不可能であることを(明らかに - 私はこれを実際に確認できません)ことです。
私の問題が発生した状況は次のとおりです。
- 私は証明書ファイルを持っています。これは、自分のcaによって署名されたゼロ(key + csr-> certificate)からopenSSLを使用して生成しました。
- Tomcatが提示するように構成したいと思います この特定の証明書 私のサイトに接続するユーザーに。
私が働くことがわかった解決策は次のとおりです。
既存の証明書を変換します と 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
. 。これが同じ問題に直面している人々に役立つことを願っています。
他のヒント
構成は正しく機能するはずです。
トムキャットのハウツー 適切なJKを持つための手順を説明します。
適切なエイリアス(TestKey)を使用して、証明書をJKSにインポートしていることを確認してください
@bozhoのコメントで拡大する、
これは本当に重要でした。 「キーと購入した証明書は、同じエイリアスの下にあります」.
CA(Verisign、Digicertなど)から購入したSSL証明書は、CSRを作成する前に生成された秘密キーと同じエイリアスでインポートする必要があります。 Java keytoolを使用して購入した証明書をキーストアにインポートした後、表示されます 「キーストアに追加された証明書返信」。
トラストチェーンを確認するには、ターミナルコマンドを使用します opensSl S_Client -Connect YourDomain.com:443 -ShowCerts。 それはあなたの証明書から始まり、信頼できるルートcaにつながります。