SSLSocket在另一个SSLSocket上

时间:2012-11-20 21:12:14

标签: java android ssl tunnel

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

非常感谢任何帮助。 Zhubin

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

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