SSL 连接重置
我正在尝试连接到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.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.0
X-Powered-By: PHP/5.2.6-1+lenny10
X-SOAP-Server: NuSOAP/0.7.3 (1.114)