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:未知协议(external / openssl / ssl / s23_srvr.c:589 0xad12b3f0:0x00000000)

谁知道我怎么能做到这一点? 我知道你的第一个问题是为什么将SSL层叠在SSL上,但我正在为需要它的EXISTING系统编写客户端。

任何帮助将非常感激。 Zhubin

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

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