Java SSLSocket在另一个SSLSocket上

Java SSLSocket在另一个SSLSocket上,java,android,ssl,tunnel,Java,Android,Ssl,Tunnel,我正在为一个系统编写一个Android客户端,该系统要求我打开一个到代理服务器的SSLSocket,进行隧道握手,然后通过隧道创建另一个SSLSocket。以下是我创建隧道的代码: SSLSocketFactory sslsocketfactory = securityService.getSslContextNoCerts().getSocketFactory(); SSLSocket sslSocket = (SSLSocket) sslsocketfactory.creat

我正在为一个系统编写一个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\u GET\u CLIENT\u HELLO:未知协议(外部/openssl/SSL/s23\u srvr.c:589 0xad12b3f0:0x00000000)

有人知道我怎样才能做到这一点吗?我知道您的第一个问题是为什么要将SSL层置于SSL之上,但我正在为需要它的现有系统编写一个客户端

任何帮助都将不胜感激。
朱斌

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

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

仍然不走运。我几乎什么都试过了,但还是犯了同样的错误。我与一个在C++客户机上工作的开发人员进行了交谈,他证实了协议是SSL上的SSL和它们各自的一个单独的握手。代理服务器也是内部开发的。@ZhubinSalehi为什么设置useClientMode=false和needClientCert=true?对等方真的会像SSL客户机一样工作吗?不用那两行试试。我不用那两行试试,尽管我需要它们,但还是没有运气。这是RFB协议中的客户端。当可以直接连接时,客户机侦听SSLServerSocket,服务器连接到它。当无法直接连接时,客户端和服务器都连接到代理服务器,在隧道握手后,它们的连接方式与直接连接中的相同。您是如何切换SSL提供程序的?我想我知道了如何使用不同的提供程序。不幸的是,这对我没有帮助。