SSLSocket поверх другого SSLSocket

Я пишу клиент Android для системы, которая требует, чтобы я открыл SSLSocket для прокси-сервера, сделал туннельное рукопожатие, а затем создал ДРУГОЙ SSLSocket через туннель. Вот мой код для создания туннеля:

    SSLSocketFactory sslsocketfactory = securityService.getSslContextNoCerts().getSocketFactory();
    SSLSocket sslSocket = (SSLSocket) sslsocketfactory.createSocket(proxyAddress.getAddress(),
            proxyAddress.getPort());
    sslSocket.setEnabledProtocols(new String[] { SecurityService.TLS10 });
    sslSocket.setEnabledCipherSuites(SecurityService.CIPHERS);
    sslSocket.startHandshake();

Затем я провожу туннельное рукопожатие, а затем:

    SSLSocketFactory sslsocketfactory = securityService.getSslContext().getSocketFactory();
    hostSocket = (SSLSocket) sslsocketfactory.createSocket(tunnel,
            InetAddress.getByAddress(remoteAddress.getIpAddress()).getHostAddress(),
            remoteAddress.getPort(), false);
    hostSocket.setUseClientMode(false);
    hostSocket.setNeedClientAuth(true);
    securityService.setEnabledProtocols(hostSocket);
    hostSocket.setEnabledCipherSuites(SecurityService.DATASESSION_CIPHERS);
    hostSocket.startHandshake();

На этом этапе я получаю исключение SSLProtocolException с этим сообщением:

ошибка: 140760FC: подпрограммы SSL: SSL23_GET_CLIENT_HELLO: неизвестный протокол (внешний / openssl / ssl / s23_srvr.c: 589 0xad12b3f0: 0x00000000)

Кто-нибудь знает, как я могу этого добиться? Я знаю, что ваш первый вопрос: зачем использовать SSL поверх SSL, но я пишу клиент для СУЩЕСТВУЮЩЕЙ системы, которая требует этого.

Любая помощь приветствуется. Жубин


person Zhubin Salehi    schedule 20.11.2012    source источник


Ответы (2)


Хорошо, я наконец исправил эту проблему. По какой-то причине, когда я использую org.apache.harmony.xnet.provider.jsse.OpenSSLProvider (провайдер SSL по умолчанию для Android), SSL через SSL не работает. Итак, я переключился на org.apache.harmony.xnet.provider.jsse.JSSEProvider, и теперь все работает нормально.

person Zhubin Salehi    schedule 23.11.2012
comment
Как вы сменили поставщика SSL? - person FD_; 09.01.2017
comment
Думаю, я понял, как использовать другого провайдера. К сожалению, в моем случае не помогло. - person FD_; 07.02.2017

Ваш код выглядит правильным. Поскольку это не работает, я предполагаю, что вы неправильно поняли требование или оно было вам неправильно истолковано. Я предлагаю вам продолжать использовать только исходный SSLSocket. Попробуй. Я считаю маловероятным, чтобы какая-либо реальная система работала так, как вы описали. Мало того, что его производительность была бы ужасной; сервер должен иметь тот же вид двойного SSL-кодирования, что и у вас: и как он узнает, когда это делать, а когда нет? После создания туннеля прокси просто копирует байты. Готов поспорить, что просто продолжать использовать исходное соединение SSL будет работать.

person user207421    schedule 20.11.2012
comment
По-прежнему не повезло. Я пробовал почти все, но все равно получаю ту же ошибку. Я поговорил с одним из разработчиков, который работает над клиентом C ++, и он подтвердил, что это протокол SSL через SSL и отдельное рукопожатие для каждого из них. Прокси-сервер также разработан собственными силами. - person Zhubin Salehi; 21.11.2012
comment
@ZhubinSalehi Почему вы устанавливаете useClientMode = false и needClientCert = true? Собирается ли партнер действительно вести себя как SSL-клиент? Попробуйте без этих двух строк. - person user207421; 22.11.2012
comment
Я пробовал без этих строк, хотя они мне нужны, и все равно не повезло. Это клиент протокола RFB. Когда возможно прямое соединение, клиент прослушивает SSLServerSocket, и сервер подключается к нему. Когда прямое соединение невозможно, и клиент, и сервер подключаются к прокси-серверу, и после установления связи туннеля они подключаются так же, как и при прямом подключении. - person Zhubin Salehi; 22.11.2012