1

我正在为需要我向代理服务器打开 SSLSocket、进行隧道握手然后在隧道上创建另一个 SSLSocket 的系统编写 Android 客户端。这是我创建隧道的代码:

    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,但我正在为需要它的现有系统编写客户端。

任何帮助将非常感激。竹斌

4

2 回答 2

0

好的,我终于解决了这个问题。由于某种原因,当我使用 org.apache.harmony.xnet.provider.jsse.OpenSSLProvider(Android 默认 SSL 提供程序)时,SSL over SSL 不起作用。所以我切换到 org.apache.harmony.xnet.provider.jsse.JSSEProvider 现在一切正常。

于 2012-11-23T20:06:50.367 回答
-1

您的代码看起来正确。由于它不起作用,我建议您误解了该要求,或者它已被歪曲给您。我建议你只需要继续使用原来的 SSLSocket。试试看。我发现任何真正的系统都不太可能按照您所描述的方式工作。它的表现不仅糟糕透顶;服务器必须具有与此处相同的双 SSL 编码:它如何知道何时执行此操作,何时不执行此操作?创建隧道后,代理仅复制字节。我敢打赌,只要继续使用原来的 SSL 连接就可以了。

于 2012-11-20T22:04:53.033 回答