1

プロキシサーバーに対してSSLSocketを開き、トンネルハンドシェイクを実行してから、トンネル上に別のSSLSocketを作成する必要があるシステム用のAndroidクライアントを作成しています。トンネルを作成するための私のコードは次のとおりです。

    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をレイヤー化するのかということですが、私はそれを必要とする既存のシステム用のクライアントを作成しています。

どんな助けでも大歓迎です。ズビン

4

2 に答える 2

0

さて、私はついにこの問題を修正しました。何らかの理由でorg.apache.harmony.xnet.provider.jsse.OpenSSLProvider(AndroidのデフォルトSSLプロバイダー)を使用すると、SSLoverSSLが機能しません。そこで、org.apache.harmony.xnet.provider.jsse.JSSEProviderに切り替えたところ、すべてが正常に機能するようになりました。

于 2012-11-23T20:06:50.367 に答える
-1

コードは正しいようです。それは機能しないので、私はあなたが要件を誤解したか、それがあなたに誤って伝えられたことを提案します。元のSSLSocketを使い続けるだけでよいことをお勧めします。それを試してみてください。実際のシステムがあなたが説明したように機能する可能性はほとんどありません。そのパフォーマンスはひどいだけではありません。サーバーは、ここにあるのと同じ種類の二重SSLコーディングを持っている必要があります。それをいつ行うか、いつ行わないかをサーバーはどのように知るのでしょうか。トンネルが作成されると、プロキシはバイトをコピーするだけです。元のSSL接続を使い続けるだけでうまくいくと思います。

于 2012-11-20T22:04:53.033 に答える