有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java 7(充当客户端)SSL握手失败,密钥库和信任库在Java 6中工作

我正在进行JBoss AS 5.1到7.4和Java 6到7的迁移,但握手失败

keystore和truststore是我们多年来在Java6中成功使用的

我写了一些测试来缩小问题的范围,它肯定不是JBoss,而是Java7

打开SSL日志后,我得到了以下信息:

17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) %% Invalidated:  [Session-2, SSL_RSA_WITH_RC4_128_SHA]
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, SEND TLSv1 ALERT:  fatal, description = certificate_unknown
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, WRITE: TLSv1 Alert, length = 2
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, called closeSocket()
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, 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
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, called close()
17:44:30,042 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, called closeInternal(true)

有一些帖子提到了这个(或类似的)问题,人们建议用不同的参数重新创建证书或信任库。我不想走这条路,因为我最近尝试为同一Web服务的不同帐户创建更多这样的密钥库和信任库,但没有成功

由于我们在Java 6的生产中使用了这些旧的(密钥库和信任库),如果可能的话,我想保留它们

看来这个问题可能是因为Java 7在检查truststore证书链方面更加严格

是否可以设置一些标志来放松检查,使其行为类似于Java 6

有一件事我不是100%确定,那就是如何解释失败消息:我认为它告诉我,这是我的机器(不是删除服务器),它不满意远程机器是安全的。对吗

感谢任何帮助/想法

==========================================================

正如所建议的,我们已经将访问WS-URL时从firefox导出的PEM(带链)添加到truststore。这并不意味着握手,但会稍微改变失败

***
%% Invalidated:  [Session-1, SSL_RSA_WITH_RC4_128_SHA]
main, SEND TLSv1 ALERT:  fatal, description = certificate_unknown
main, WRITE: TLSv1 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 01 00 02 02 2E                               .......
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
    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:1341)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
    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:1016)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)

==============================================================

此外,正如在其他线程中所建议的,我编写了另一个测试,该测试使用不验证证书链的TrustManager,并使用我最初的truststore运行了这个测试

这个测试能够连接,因此表明我的机器对远程机器的验证是唯一的问题,并且我的密钥库是好的

然而,我不能对我们实际的webservice客户端使用这种方法,因为它使用Sun RPC库,并且连接发生在它们代码的深处,所以我不能碰它


共 (1) 个答案

  1. # 1 楼答案

    首先,是的,例外情况是机器中的Java SSL模块不信任从服务器收到的身份证明(证书)

    是的,Java7执行更严格的检查。可能还有更多,但我敢肯定的一点是,它不允许子证书的有效期在父证书/CA证书之后结束(或在之前开始,但实际上不会发生)。请参阅PKIX Path does not chain with any of the trust anchors error in Windows Environment,它表示这是一个错误,将被修复

    检查:如果服务器是Web服务器,您可以使用浏览器访问任何(无害的)页面,并使用该页面查看证书链。否则,运行openssl s_client -connect $host:443 -showcerts,一旦它连接到enter EOF(Unix^D,Windows^Z),然后将每个 BEGIN CERT... -END CERT...块放在不同的文件中,并按顺序在每个块上运行openssl x509 -noout -subject -issuer -startdate -enddate

    解决方法:如果这是一个问题,似乎没有任何方法可以直接关闭它,除非关闭所有证书检查(从而失去SSL的一些安全性),但是将服务器实体证书添加到信任库应该是可行的,因为Java不会验证链。(不需要删除已有的内容,只需使用尚未使用的别名即可。)祝你好运