我遇到了一个奇怪的问题——供应商使用TLS SSLv3,同时使用自签名客户端和服务器证书。Java1.5和Java1.6没有这个问题——只需将客户端证书和私钥导入密钥库,将服务器公共证书导入信任库。一切都很好。然而,在Java7中,服务器证书无法被信任,即使使用的是同一个信任库。我尝试过使用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)
由于某些原因Java8不接受自签名证书,即使添加到其cacerts
存储中。
我的解决方法是创建一个自定义密钥库:
openssl-req-x509-newkey rsa:4096-keyout-key。pem-out cert.pem-days 365-subc”/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
我在处理JDK1.7时也遇到过这种情况。如果用-x509选项调用req命令,最好在v3_ca部分取消对keyUsage行的注释,并用(见http://wwwneu.secit.at/web/documentation/openssl/openssl_cnf.html)再次生成CA
openssl req -new -x509 -days 3650 -keyout ca.key -out ca.crt -config openssl.cnf -extensions v3_ca -batch
如果使用生成的CA证书对其他证书进行签名,请确保还取消了对项basicConstraints=CA:true的注释,并将值设置为true
我实际上有一个有点类似的问题,当使用Java1.6时,Tomcat应用程序会信任信任存储中的ca证书,并用java 1.7拒绝它。在向我的ca证书添加keyUsage
后,它就可以工作了(在阅读错误报告后,JDK-7018897: CertPath验证不能处理具有错误KeyUsage的自签名证书)。
我所做的(Ubuntu 12.04 x64):
>
使用命令从包含keyUsage
的旧ca证书生成新的ca证书:
openssl x509 -in oldca.pem -clrext -signkey oldca.key -extfile /etc/ssl/openssl.cnf -extensions v3_ca -out newca.pem
从信任库中删除旧的CA密钥并插入新密钥。
我已经看到了一些使用X509TrustManager实现TrustManager的示例,尽管显然Java7不支持这些约定,X509TrustManager本身也被弃用。 感谢您的建议和任何在Java7上工作的代码示例。
我有一个纯Java的应用程序,目前使用基于. jks的密钥和信任存储。据我所知,Bluemix下的SSL协议处理是在网络端使用单个端口和用于主机和域标识的通配符证书完成的。我关心的是信任存储的使用,在那里我用来添加可信伙伴节点的证书,例如身份提供者。是否有高级上传工具可以帮助安装受信任的证书?有了这些功能,Java可以将其功能限制在非常基本的HTTP实现上,并由云及其在动态端口上发生的HTTP到H
证书、私钥(客户端)和客户端证书都是pem格式的,我必须将它们添加到信任存储区和密钥存储区中。我该怎么做呢?到目前为止,我在cmd(windows)中有命令: > 要生成PKC(key:客户端私钥,cert:客户端cert,CA:CACERT):openssl pkcs12-inKey key.pem-in cert.pem-export-out keystored.p12-certfile CA
在证书链验证期间,我需要将自定义的自签名根证书标记为受信任的,总的来说,我希望尽可能依赖系统API。 我创建了一个临时内存存储。 然后我将自定义根证书放入存储中。 CertGet证书链MSDN留档表示 HadAdditional存储任何附加存储的句柄,以搜索支持证书和证书信任列表(CTL)。 据我所知,如果我用根证书创建一个CTL并将其放置到存储中,CertGet证书链将信任它。因此,我在分配的缓
我正在尝试用Java执行相互身份验证。我试图实现的结构是:具有自签名证书的服务器充当CA,对客户端证书进行签名。因此,这就是我在每个密钥库/信任库中保存的内容: 客户: 密钥库: 客户端的SSL密钥对。 由服务器签署的证书(与密钥对相关)。 信任库: 服务器的自签名证书 服务器 密钥库: 服务器的SSL密钥对。 自签名证书(与密钥对相关)。 信任库: 服务器的自签名证书 我能够执行服务器的身份验证