Сброс 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 и новому 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 с помощью curl; Это что-то специфичное для 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)
Author: huelbois, 2011-04-01

1 answers

Это проблема с версией SSL. Сервер поддерживает только SSLv3, а Java запустится с версии 2 и попытается выполнить согласование вверх, но не все серверы поддерживают этот тип согласования.

Принуждение java использовать только SSLv3 - единственное известное мне решение.

Редактировать, есть два способа сделать это, о которых я знаю:

  • Если вы создаете сокет вручную, вы можете установить включенные протоколы

    Сокет.setEnabledПротоколы(новая строка[] {"SSLv3" });

  • Если вы используете библиотеку более высокого уровня, вам, вероятно, потребуется настроить все запросы SSL на использование только версии 3, что выполняется с помощью системного свойства "https.протоколы":

    Java -Dhttps.протоколы=SSLv3

 35
Author: roguenet, 2011-04-01 17:44:40