繁体   English   中英

SSLSession对等方未通过身份验证

[英]SSLSession peer not authenticated

我从简单的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());

线程“主”中的异常javax.net.ssl.SSLPeerUnverifiedException:在sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:431)上的对等对象未通过sslconnecting.Sslconnecting.main(Sslconnecting.java:33)进行身份验证

用OpenSSL查看证书似乎很正常,包括www。 前缀,我尝试过此网站的每个浏览器都对证书感到满意。

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

X509v3扩展名:X509v3使用者替代名称:DNS:www.velocityfrequentflyer.com

有趣的是,如果我将主机更改为Velocityfrequentflyer.com,这确实让我感到很困惑。

是否可以在没有JAVA进行检查的情况下调用getPeerCertificates?

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

编辑1:

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

线程“ main”中的异常javax.net.ssl.SSLHandshakeException:收到致命警报:sun.security.ssl.Alerts.getSSLException(未知来源),sun.security.ssl.Alerts.getSSLException(未知来源),handshake_failure。位于sun.security.ssl.SSLSocketImpl.readRecord(未知来源)处的security.ssl.SSLSocketImpl.recvAlert(未知源)位于sun.security.ssl.SSLSocketImpl.startHandshake(未知源)位于sun.security.ssl.SSLSocketImpl.startHandshake(未知源)位于sslconnecting.Sslconnecting.main(Sslconnecting.java:33)

编辑2。

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

jdk.tls.disabledAlgorithms = SSLv3,RC4

但是,一旦允许RC4,则握手完成。 仍然没有解释为什么没有www时握手会通过。 字首。

再次很奇怪。

如果握手失败,我会期望getSession()抛出相同的异常,因为如果需要AFAIK,它将调用startHandshake()

似乎该对等端不讲TLSv1.2或可能需要RC4。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM