【发布时间】:2016-05-04 15:54:32
【问题描述】:
我正在尝试对由内部 CA 签名的服务器进行 https 调用。尽管在信任库中添加了根证书,但我无法使其正常工作,因此我将 trustManager 设置为信任所有证书并暂时禁用主机名验证。curl --insecure 调用有效。
使用-Djavax.net.debug=all,客户端打招呼后握手失败
*** ClientHello, TLSv1 ... ... main, READ: TLSv1 Alert, length = 2 main, RECV TLSv1 ALERT: fatal, handshake_failure main, 调用 closeSocket() main, 处理异常: javax.net.ssl.SSLHandshakeException:收到致命警报: handshake_failure main, 称为 close() main, 称为 关闭内部(真)
堆栈跟踪是:
javax.net.ssl.SSLHandshakeException:收到致命警报: 握手失败在 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 在 sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 在 sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
我正在使用
获取 SSL 上下文SSLContext sslContext = SSLContext.getInstance("TLS");
任何帮助将不胜感激。
PS:我正在使用 java7
【问题讨论】:
-
在验证证书信任之前会发生握手失败。检查两端都启用了 TLS,并且有一个通用的密码套件。查看服务器端的日志,检查与wireshark的协商。
-
请使用
-Djavax.net.debug=ssl,handshake运行您的客户端并将结果发布到您的问题中。