gpt4 book ai didi

java - SSLSession 对等体未通过身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:32 24 4
gpt4 key购买 nike

我从简单的 SSLSocket (Java 8 u45) 连接到具有有效证书和域的站点时收到证书验证错误。

    String hostName = "www.velocityfrequentflyer.com";
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) factory.createSocket(hostName, 443);
SSLSession session = sslsocket.getSession();
java.security.cert.Certificate certicates[] = session.getPeerCertificates();
X509Certificate cert = (X509Certificate) certicates[0]; //the peer certificate
System.out.println("cert.getIssuerDN().getName(): " + cert.getIssuerDN().getName());
System.out.println("cert.getSubjectDN().getName(): " + cert.getSubjectDN().getName());

Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:431) at sslconnecting.Sslconnecting.main(Sslconnecting.java:33)

查看带有 OpenSSL 的证书,一切似乎都是有序的,包括 www.前缀和我在该站点上尝试过的每个浏览器都对证书感到满意。

openssl s_client -showcerts -connect www.velocityfrequentflyer.com:443 | openssl x509 -noout -text | less

X509v3 extensions: X509v3 Subject Alternative Name: DNS:www.velocityfrequentflyer.com

有趣的是,如果我将主机更改为 velocityfrequentflyer.com 这让我真的很困惑,这会起作用。

有没有办法在 JAVA 不检查的情况下调用 getPeerCertificates?

我尝试使用 TrustAll SocketFactory 得到相同的结果。

编辑 1:

添加 startHandshake() 后,似乎是握手本身失败了:(完整 SSL 调试:http://pastebin.com/ZKnjrGPR)

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source) at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) at sslconnecting.Sslconnecting.main(Sslconnecting.java:33)

编辑 2.

原来该站点需要不安全的密码套件 RC4?java.security 配置设置为不使用它们。

jdk.tls.disabledAlgorithms=SSLv3,RC4

然而,一旦 RC4 被允许,握手就会完成。它仍然没有解释为什么握手在没有 www 的情况下进行。前缀。

最佳答案

又很奇怪。

如果握手失败,我预计 getSession() 会抛出相同的异常,因为它会在必要时调用 startHandshake() AFAIK。

看起来那个对等点不使用 TLSv1.2 或者可能想要 RC4。

我建议您通过 HandshakeCompletionListener 而不是您现在这样做的方式来获取对等证书。这样会失败的是套接字上的第一个 I/O,而不是 getPeerCertificate()。 如果您不喜欢对等证书,则可以在监听器中关闭套接字。

关于java - SSLSession 对等体未通过身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32042589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com