我正在尝试在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库和new URL("https://...")进行连接
- 使用new 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)