Java SSL连接重置
我正在尝试连接到Java中的HTTPS端点。我尝试过的每一种方法(详细信息如下)最终都会生成此堆栈跟踪:Java SSL连接重置,java,php,apache,ssl,openssl,Java,Php,Apache,Ssl,Openssl,我正在尝试连接到Java中的HTTPS端点。我尝试过的每一种方法(详细信息如下)最终都会生成此堆栈跟踪: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:168) at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293) at com.sun.net.
java.net.SocketException: Connection reset
at 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 libs和一个新的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特有的
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.0
X-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”
java -Dhttps.protocols=SSLv3