我试图通过
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浏览器连接到这个服务器,并且使用带有卷曲的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)