SSL连接重置
我正在尝试连接到Java中的HTTPS端点。我尝试过的每种方法(下面有更多详细信息)最终都会生成此堆栈跟踪:
java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:798)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:753)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
我努力了:
- 与javax SOAP库和新的URL(“ https:// …”)连接
- 使用新的URL(“ https:// …”).openConnection()连接
- 手动创建SSL连接:
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket("...", 443);
Writer out = new OutputStreamWriter(socket.getOutputStream());
// https requires the full URL in the GET line
//
out.write("GET / HTTP/1.0\r\n");
out.write("\r\n");
out.flush();
// read response
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
int c;
while ((c = in.read()) != -1) {
System.out.write(c);
}
out.close();
in.close();
socket.close();
更多细节:
- 我尝试过的每一种方法都可以与其他SSL服务器配合使用,这就是这种特殊的服务器(我不能随意讨论什么服务器,它是业务合作伙伴)
- 我既可以使用Web浏览器,也可以使用带有curl的伪造的SOAP请求连接到该服务器;这是特定于Java的东西。
因此,很显然,Java与HTTPS服务器之间在握手应该如何停止方面存在分歧,这可能意味着该服务器具有一些奇怪的SSL配置。但是,我没有直接访问服务器的权限,而且那里的人遍布世界的一半,因此由于时区的差异很大,通信有些紧张。
如果我的假设正确,那么可能会有什么SSL问题?是什么原因引起的?我在哪里可以要求服务器控制人员查找问题?当我使用curl进行请求时,我会获得以下服务器配置标头:
Server: Apache/2.2.9 (Debian) mod_jk/1.2.26 PHP/5.2.6-1+lenny10 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g mod_perl/2.0.4 Perl/v5.10.0X-Powered-By: PHP/5.2.6-1+lenny10
X-SOAP-Server: NuSOAP/0.7.3 (1.114)
回答:
这是一个SSL版本问题。该服务器仅支持SSLv3,而Java将从v2开始,并尝试向上协商,但并非所有服务器都支持该类型的协商。
强制Java仅使用SSLv3是我所知道的唯一解决方案。
编辑,我知道有两种方法可以做到这一点:
如果要手动创建套接字,则可以设置已启用的协议
socket.setEnabledProtocols(new String[] { "SSLv3" });
如果您使用的是更高级别的库,则可能需要将所有SSL请求设置为仅使用v3,这可以通过
"https.protocols"
system属性来完成:java -Dhttps.protocols=SSLv3
以上是 SSL连接重置 的全部内容, 来源链接: utcz.com/qa/426973.html