4

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
4

1 回答 1

8

Java 7u9

首先,感谢布鲁诺对这个相关问题的帮助,这使我得到了最终答案。

回答我自己的问题。来之不易的知识。

解决方案是在创建 SSL Engine 时将请求目标的主机和端口添加到构造函数中:

SSLEngine engine = tcpHelper.getSSLContext().createSSLEngine(targetHost, targetPort);

如果没有这个,Java 最终会在 SSL 库 (IPAddressUtil.textToNumericFormatV4) 深处抛出 NullPointerException,这会导致 SSL 调试输出中的错误消息不是很有帮助。

于 2012-11-15T03:04:25.150 回答