2017-11-29 15 views
0

다음 Java 코드를 사용하여 소켓 프록시를 통해 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 : SOCKS 연결의 "내부"에 TLS를 사용하고 있으므로 TLS 1.2 메시지가 표시됩니다. SOCKS 연결은 실제로 연결의 초기 데이터 일 뿐이므로 프록시가 연결할 위치와 인증을 알립니다. 이 악수 후에 원래 (TLS) 메시지가 전송되므로 wireshark에서도이 메시지를 볼 수 있습니다. –

1

수정 됨 SOCKS 핸드 셰이크는 암호화되지 않습니다. 업스트림 연결이 설정되면 코드와 업스트림 피어간에 SSL 핸드 셰이크가 발생하고 SSL은 여기에서 엔드 투 엔드입니다. SOCKS 프록시는 무슨 일이 일어나는지 알지 못합니다.

+0

wireshark에서 CONNECT 패킷이 보이지 않습니다. 보내는 데이터는 일부 맞춤 데이터입니다 (HTTP가 아님). – user3202934

+0

잘못된 프록시 종류, 편집 됨. – EJP