私の会社では、デフォルトでhttpを使用する顧客にTomcat/MySQLベースのアプリケーションを提供しています。顧客の要求に応じて、自己署名証明書を作成してhttpsを使用できるようにしました。これは、自己署名証明書を使用するときに予期されるブラウザエラーの影響を受けて機能しました。
ペンテストの結果、非推奨のsslプロトコルと暗号を無効にする必要があると判断したため、Tomcat server.xmlのsslコネクタを次のように修正しました。
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2,TLSv1.1" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_WITH_AES_128_GCM_SHA256"
keystoreFile="/path/to/keystore/file"
keystorePass="password" />
これはペンテストを満たし、アプリケーションは3つすべてのメインブラウザー(Chrome、Firefox、IE)で引き続き動作しました。ただし、ペンテストでも自己署名証明書を使用しないことが理想的であるというフラグが立てられたため、 theseguides に従って、CSRを作成し、お客様に作成してもらいました内部ドメインに署名された証明書(サーバーにはいくつかの異なるURLからアクセスできるため、SANでCSRを作成する必要があります)。
証明書を新しいキーストアに追加し、server.xmlファイルのパスを適切に修正しました。接続しようとすると、次のエラーが表示されます(これはFirefoxからのものですが、すべてのブラウザで同様のエラーが発生します)。
安全な接続に失敗しました
172.31.1.36:8443への接続中にエラーが発生しました。ピアと安全に通信できません:一般的な暗号化アルゴリズムがありません。エラーコード:SSL_ERROR_NO_CYPHER_OVERLAP
受信したデータの正当性を確認できなかったため、表示しようとしているページを表示できません。この問題を通知するには、Webサイトの所有者に連絡してください。
私の理解では、証明書はどの暗号またはプロトコルを使用する必要があるかを制御していないため、これが発生した理由がわかりません。これは、CSRの作成時に作成したエラーですか、それとも、クライアントが証明書の生成時に作成したエラーですか?
-編集-
曲がるたびにエラーが発生するようです。鍵を鍵ストアにインポートしようとすると、次のいずれかになります。
cat <keyfile> | openssl pkcs12 -export -out <keystore>.p12
Enter pass phrase:
unable to load certificates
またはこれ:
keytool -importkeystore -srckeystore <keyfile> -srcstoretype pkcs12 -destkeystore <keystore>.jks
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
keytool error: Java.io.IOException: toDerInputStream rejects tag type 45
顧客に証明書チェーンを送信してもらい、インポートしようとすると、次のエラーが発生します。
keytool -import -trustcacerts -alias Tomcat -file <certchain>.p7b -keystore <keystorefile>.jks
Enter keystore password:
keytool error: Java.lang.Exception: Input not an X.509 certificate
Pkcsファイルをx.509に変換する方法に関するいくつかの解決策を見つけましたが、他のエラーが発生したため、今は完全に行き詰まっています。
すべての問題の根本的な原因は、証明書の形式が間違っていたことです。
Info here に従って、証明書が実際にDER形式であることがわかりました。次のように変換しました:
openssl x509 -inform der -in certfile.cer -out new_certfile.pem