以上的SSLSocket其他的SSLSocket(SSLSocket over another SS

2019-08-03 00:35发布

我正在写一个Android客户端,需要我打开的SSLSocket到代理服务器,做隧道握手,然后创建了隧道ANOTHER的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:00000000)

任何人都知道我能做到这一点? 我知道你的第一个问题将是通过SSL为什么层SSL,但我正在写一个客户端和现有的系统需要它。

任何帮助将非常感激。 Zhubin

Answer 1:

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



Answer 2:

您的代码看起来是正确的。 由于它不工作,我建议你有误解的要求,或已被歪曲到你。 我建议你只需要使用原来的SSLSocket保持。 试试吧。 我觉得微乎其微不可能的,任何真正的系统中,你所描述的方式工作。 不仅将它的性能是非常糟糕; 服务器必须具有相同类型的,你这里有双SSL编码:它怎么会知道什么时候做,何时不? 一旦隧道创建代理只是复制字节。 我敢打赌,只是继续使用原来的SSL连接将正常工作。



文章来源: SSLSocket over another SSLSocket