奇妙な問題があります。サプライヤは、自己署名クライアントとサーバー証明書の両方でTLSSSLv3を使用しています。これはJava1.5とJava1.6では問題になりませんでした。クライアント証明書と秘密鍵をキーストアにインポートし、サーバーの公開証明書をトラストストアにインポートするだけです。すべてが正常に動作します。ただし、Java7では、同じトラストストアが使用されていても、サーバー証明書は信頼されません。 WindowsとRedHatの両方でJava7(1.7.03、04と05、x86とx64バージョン)を使用してみましたが、成功しませんでした。
キーストア/トラストストアを最初から再作成しましたが、これらの証明書のみが含まれています。適切なシステムプロパティ(javax.net.ssl.keyStore、javax.net.ssl.trustStore)が設定されており、重要な側面は、まったく同じコードと構成がJDK5/6で完全に実行されることです。
私は途方に暮れています-追加のチェックへの参照を見つけることができませんが、証明書がトラストストアにあるという事実は、自己署名されているかどうかに関係なく信頼されていることを意味するはずだと思いました。
助けていただければ幸いです。広告
例外トレース:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path validation failed: Java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
Sun.security.validator.ValidatorException: PKIX path validation failed: Java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1868)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:276)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:270)
at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1338)
at Sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:154)
at Sun.security.ssl.Handshaker.processLoop(Handshaker.Java:868)
at Sun.security.ssl.Handshaker.process_record(Handshaker.Java:804)
at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:998)
at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1294)
at Sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.Java:685)
at Sun.security.ssl.AppOutputStream.write(AppOutputStream.Java:111)
at Sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.Java:221)
at Sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.Java:291)
at Sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.Java:295)
at Sun.nio.cs.StreamEncoder.flush(StreamEncoder.Java:141)
at Java.io.OutputStreamWriter.flush(OutputStreamWriter.Java:229)
at com.alltria.ypsilon.testing.TestSSL.main(TestSSL.Java:65)
Caused by: Sun.security.validator.ValidatorException: PKIX path validation failed: Java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
at Sun.security.validator.PKIXValidator.doValidate(PKIXValidator.Java:350)
at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:249)
at Sun.security.validator.Validator.validate(Validator.Java:260)
at Sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:326)
at Sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.Java:231)
at Sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:126)
at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1320)
... 13 more
Caused by: Java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
at Sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.Java:208)
at Java.security.cert.CertPathValidator.validate(CertPathValidator.Java:279)
at Sun.security.validator.PKIXValidator.doValidate(PKIXValidator.Java:345)
... 19 more
Java Result: 1
Sslデバッグが失敗する部分は、サーバー証明書を検証しようとしています。
***
%% Invalidated: [Session-1, SSL_RSA_WITH_RC4_128_SHA]
main, SEND SSLv3 ALERT: fatal, description = certificate_unknown
main, WRITE: SSLv3 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 00 00 02 02 2E .......
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path validation failed: Java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
main, called close()
main, called closeInternal(true)
実際、TomcatアプリケーションがJava 1.6を使用すると、トラストストア内のCA証明書を信頼し、Java 1.7で拒否するという同様の問題が発生しました。 keyUsage
を私のca証明書に追加すると機能します(バグレポートを読んだ後、 JDK-7018897:CertPath検証は悪いKeyUsageで自己署名証明書を処理できません )。
私がしたこと(Ubuntu 12.04 x64):
v3_ca
セクションのkeyUsage
行のコメントを解除します。次のコマンドを使用して、keyUsage
が含まれている古い証明書から新しいca証明書を生成します。
openssl x509 -in oldca.pem -clrext -signkey oldca.key -extfile /etc/ssl/openssl.cnf -extensions v3_ca -out newca.pem
トラストストアから古いCAキーを削除し、新しいCAキーを挿入します。
いくつかの理由で、Java 8は、cacerts
ストアに追加された自己署名証明書を受け入れません。
そのための私の回避策は、カスタムキーストアを作成することです。
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj "/C=MA/ST=ByExample/L=Test/O=Chapter3/OU=Org/CN=bip70.com" -node
s
keytool -import -keystore clientkeystore -file cert.der -alias bip70.com -storepass changeit
次に、My IDE jvm引数として使用:-Djavax.net.ssl.trustStore=clientkeystore
JDK 1.7を扱っているときにも、この状況に遭遇しました。 -x509オプションを指定してreqコマンドを呼び出す場合は、v3_caセクションのkeyUsage行のコメントを解除し、次のコマンドでCAを再度生成することをお勧めします。 ( http://wwwneu.secit.at/web/documentation/openssl/openssl_cnf.html を参照)
openssl req -new -x509 -days 3650 -keyout ca.key -out ca.crt -config openssl.cnf -extensions v3_ca -batch
また、生成されたCA証明書を使用して他の証明書に署名する場合は、アイテムbasicConstraints = CA:trueのコメントを解除し、値をtrueに設定してください。