Сброс соединения SSL

Я пытаюсь подключиться к конечной точке HTTPS в Java. Каждый метод, который я попробовал (подробнее см. Ниже), приводит к созданию этой трассировки стека:

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, это именно тот сервер (я не имею права обсуждать, какой сервер, это деловой партнер)
  • Я могу подключиться к этому серверу как с веб-браузером, так и с фальшивым запросом SOAP с завитком; Это нечто специфичное для Java.

Таким образом, кажется довольно очевидным, что между Java и HTTPS-сервером существует некоторое несогласие относительно того, как должно быть достигнуто рукопожатие, что, вероятно, означает, что у сервера есть некоторая странная конфигурация SSL. Тем не менее, у меня нет прямого доступа к серверу, и люди, которые делают это на полпути по всему миру, поэтому общение немного напряжено из-за очень разных часовых поясов.

Если мои предположения верны, какие могут быть проблемы с SSL? Что может вызвать что-то подобное? Где я могу попросить людей, контролирующих сервер, искать проблемы? Когда я делаю запрос с завиванием, я возвращаю эти заголовки конфигурации сервера:

 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