2017-11-29 17 views
0

次のJavaコードを使用して、socksプロキシ経由でsslソケットを作成しています。SSLソケットのソックス・プロキシー - クライアント<--->はサーバー・データを暗号化していますか?

SocketAddress addr = new InetSocketAddress(proxy_ip, prox_port); 
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); 
Socket plainSocket = new Socket(proxy); 
InetSocketAddress dest = new InetSocketAddress(server_ip, 443); 
plainSocket.connect(dest); 
socket = (SSLSocket) sslSocketFactory.createSocket(plainSocket, config.getApiHost(), config.getApiPort(), true); 
socket.startHandshake(); 

このコードは機能します。クライアントからプロキシへのデータが暗号化されているかどうかはわかりません。 wiresharkでは、プロキシとサーバーの間のデータだけが暗号化されていることがわかります。なぜこれが当てはまるのですか?クライアントとプロキシの間でデータを暗号化するにはどうすればよいですか?

答えて

1

SOCKS自体は暗号化も暗号化も解除されません。それは、クライアントとターゲットサーバーの間でデータを何も変更せずに転送することだけです。したがって、データがすでに暗号化されている場合は、そのまま維持されます。暗号化されなかった場合、SOCKSは転送に対する保護を追加しないため、スニッフィングと変更のためにオープンされます。

特定のケースでは、SOCKS接続内でSSLを使用しています。これは、アプリケーションデータがSOCKSプロキシなしと同じ方法で暗号化されることを意味します.SSLを正しく使用すると(強力な暗号、適切なサーバー認証) SOCKSプロキシを使用すると強く保護されます。代わりに、サーバー証明書を正しく検証しないなど、正しくSSLを実行できない場合、SOCKSはデータ保護に役立ちません。代わりに、SOCKSサーバーのオペレータは、この場合、安全なSSL接続を簡単に行うことができます。これは、ネットワーク内の適切な位置にあるため、これを行う必要があります。

+0

しかし、wiresharkでは、私はTLSV1.2パケットがプロキシとサーバーの間に入ることしか見ていません。アプリケーションデータは暗号化されていることが示されています。しかし、クライアントとプロキシの間では、暗号化されていないデータフィールドを持つTCPパケットが送信されています。私はSOCKSサーバー用のcharlessプロキシを使用しています。 – user3202934

+0

@ user3202934:TLS 1.2メッセージは、SOCKS接続の「内側」にあるTLSを使用しているために表示されます。 SOCKS接続は実際には、接続の初期データだけで、プロキシに接続先と認証が分かるようにします。このハンドシェイクの後、元の(TLS)メッセージが送信され、それがwiresharkでも見ることができます。 –

1

EDITED SOCKSハンドシェイクは暗号化されていません。アップストリーム接続が確立されると、コードとアップストリームピアとの間でSSLハンドシェイクが発生し、そこからSSLがエンドツーエンドになります。 SOCKSプロキシは、何が起こっているのかわかりません。

+0

wiresharkのCONNECTパケットは表示されません。送信するデータはカスタムデータ(HTTPではない)です。 – user3202934

+0

間違った種類のプロキシが編集されました。 – EJP

関連する問題