12

私は奇妙な問題を抱えています - サプライヤーは、自己署名のクライアントとサーバー証明書の両方で TLS SSLv3 を使用しています。これは、Java1.5 と Java1.6 では問題になりませんでした。クライアント証明書と秘密鍵をキーストアにインポートし、サーバーの公開証明書をトラストストアにインポートするだけです。すべて正常に動作します。ただし、Java7 では、同じトラストストアが使用されていても、サーバー証明書は信頼されません。Java7 (1.7.03、04 および 05、x86 および x64 バージョン) を使用して Windows と Red Hat の両方を試しましたが、成功しませんでした。

キーストア/トラストストアをゼロから再作成しましたが、これらの証明書のみが含まれています。適切なシステム プロパティ (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)
4

3 に答える 3

10

私は実際に、Tomcat アプリケーションが Java 1.6 を使用しているときにトラストストアの ca 証明書を信頼し、Java 1.7 でそれを拒否するという、やや似た問題を抱えていました。keyUsage私のca証明書に追加した後、それは機能します(バグレポートを読んだ後、 JDK-7018897: CertPath validation cannot handle self-signed cert with bad KeyUsage )。

私がやったこと(Ubuntu 12.04 x64):

  1. keyUsage/etc/ssl/openssl.cnf を編集し、セクションの行のコメントを外しv3_caます。
  2. keyUsage次のコマンドを使用して、含まれている古い CA 証明書から新しい CA 証明書を生成します。

    openssl x509 -in oldca.pem -clrext -signkey oldca.key -extfile /etc/ssl/openssl.cnf -extensions v3_ca -out newca.pem
    
  3. トラストストアから古い CA キーを削除し、新しい CA キーを挿入します。

于 2012-08-27T22:43:12.927 に答える