Java 7u9
标题中的错误信息是:“致命错误:80:问题展开网络记录”。所以不会让我把“问题”放在标题中。
我正在构建针对Netty的Java HTTPS客户端。 SSL握手工作正常,直到我添加“HTTPS”端点识别算法以启用服务器主机名验证:
SSLEngine engine = tcpHelper.getSSLContext().createSSLEngine();
SSLParameters sslParameters = engine.getSSLParameters();
sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
engine.setSSLParameters(sslParameters);
engine.setUseClientMode(true);
添加算法后,SSL握手挂起,连接最终超时。启用SSL调试(javax.net.debug = all)后,我可以看到在服务器发送服务器的证书链后,ServerHello之后的握手现在失败了
*** ServerHelloDone
1761586552@qtp-1653588482-2, WRITE: TLSv1.2 Handshake, length = 3294
在服务器上。客户端接收并显示证书链,然后失败:
New I/O worker #3, fatal error: 80: problem unwrapping net record
java.lang.RuntimeException: Delegated task threw Exception/Error
%% Invalidated: [Session-1, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256]
New I/O worker #3, SEND TLSv1.2 ALERT: fatal, description = internal_error
New I/O worker #3, WRITE: TLSv1.2 Alert, length = 2
答案 0 :(得分:8)
Java 7u9
首先,感谢布鲁诺在this related question的帮助,这引导我做出最终答案。
回答我自己的问题。很难赢得知识。
解决方案是在创建SSL引擎时将请求目标的主机和端口添加到构造函数中:
SSLEngine engine = tcpHelper.getSSLContext().createSSLEngine(targetHost, targetPort);
如果没有这个,Java将最终在SSL库(IPAddressUtil.textToNumericFormatV4)深处抛出NullPointerException方式,这会在SSL调试输出中产生非常有用的错误消息。