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, но я пишу клиент для существующей системы, которая требует этого.

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

2 ответа

Решение

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

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

Другие вопросы по тегам