我正在尝试使用 https://portal.mvp.bafin.de/database/AnteileInfo/ 2.23 Java 7 ,Ubuntu下的 HTTPS 页面HTML Unit Linux操作系统。
以下代码在几天前工作,但现在我收到了下面报告的例外情况。
问题应该与所使用的安全证书的类型有关,但是当我阅读时,使用vm选项“ - Dhttps.protocols = TLSv1.1,TLSv1.2”执行代码没有任何变化here
代码:
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class SSLTest {
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
final String URL = "https://portal.mvp.bafin.de/database/AnteileInfo/";
final WebClient wc = new WebClient();
// the code should be ok without the following line,
// but even with it, it doesn't work
// wc.getOptions().setSSLClientProtocols(new String[]{"TLSv1.1","TLSv1.2"});
final HtmlPage mainPage = wc.getPage(URL);
}
}
例外情况如下:握手期间远程主机关闭连接
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:880)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
at com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.connectSocket(HtmlUnitSSLConnectionSocketFactory.java:189)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71)
at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:183)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1358)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1275)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:382)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:304)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:451)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:436)
at fetchers.bafin.SSLTest.main(SSLTest.java:16)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:352)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:861)
... 23 more
如果取消注释以下行
wc.getOptions().setSSLClientProtocols(new String[]{"TLSv1.1","TLSv1.2"});
我在下面得到了一个例外,它给出了一个略有不同的消息:致命警报:handshake_failure
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1911)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
[...]
有什么建议吗?
答案 0 :(得分:1)
问题已经解决了升级到Java 8的问题,正如海辉在评论中所说(但我刚刚在评论之前进行了升级)。
我在阅读Oracle's blog about HTTPS debugging之后升级到Java 8,并在$ JAVA_HOME / lib / security中复制了那里建议的JCE文件(没有改变)。
在我看到this site about SSL Site debugging无法使用java 7进行连接后,我决定升级到java 8。
在调试期间,我将其添加到JRE参数
-Djavax.net.debug=all
了解发生了什么。