【问题标题】:SSLSocket over another SSLSocket另一个 SSLSocket 上的 SSLSocket
【发布时间】:2012-11-09 01:15:50
【问题描述】:

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

任何帮助将不胜感激。 竹斌

【问题讨论】:

    标签: java android ssl tunnel


    【解决方案1】:

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

    【讨论】:

    • 您是如何切换 SSL 提供商的?
    • 我想我知道如何使用不同的提供程序。不幸的是,这对我没有帮助。
    【解决方案2】:

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

    【讨论】:

    • 还是没有运气。我几乎尝试了任何东西,但仍然遇到同样的错误。我与一位在 C++ 客户端上工作的开发人员交谈过,他确认该协议是 SSL over SSL,并且每个人都有单独的握手。代理服务器也是内部开发的。
    • @ZhubinSalehi 为什么要设置 useClientMode=false 和 needClientCert=true?对等点真的会充当 SSL 客户端吗?尝试不使用这两条线。
    • 我尝试不使用这些行,即使我需要它们但仍然没有运气。这是 RFB 协议中的客户端。当可以直接连接时,客户端侦听 SSLServerSocket 并且服务器连接到它。当无法直接连接时,客户端和服务器都连接到代理服务器,并在隧道握手后以与直接连接相同的方式连接。
    猜你喜欢
    • 2017-06-24
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多