簡體   English   中英

Java7拒絕信任信任庫中的證書

[英]Java7 Refusing to trust certificate in trust store

我有一個奇怪的問題 - 供應商使用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)

我實際上有一個類似的問題,在使用Java 1.6時,Tomcat應用程序會信任信任庫中的ca證書,並使用java 1.7拒絕它。 keyUsage添加到我的ca證書后,它可以正常工作(在閱讀錯誤報告后, JDK-7018897:CertPath驗證無法處理帶有錯誤KeyUsage的自簽名證書 )。

我做了什么(Ubuntu 12.04 x64):

  1. 編輯/etc/ssl/openssl.cnf並取消注釋v3_ca部分中的keyUsage行。
  2. 使用以下命令生成包含keyUsage舊ca證書:

     openssl x509 -in oldca.pem -clrext -signkey oldca.key -extfile /etc/ssl/openssl.cnf -extensions v3_ca -out newca.pem 
  3. 從信任庫中刪除舊的CA密鑰並插入新的CA密鑰。

在處理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證書簽署其他證書,請確保您還取消注釋itemConstraints = CA:true並將值設置為true

由於某些原因,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

然后在我的IDE中使用它作為jvm參數: -Djavax.net.ssl.trustStore=clientkeystore

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM