2013-01-04 3 views
1

브라우저 (Firefox와 같은)에서 연결 요청을 수신하고 통계 정보에 대한 요청을 구문 분석 한 다음 요청을 원래 대상으로 전달하는 간단한 프로그램을 작성하고 있습니다 (Java). 그런 다음 프로그램은 대상에서 응답을 읽고 통계 정보에 대한 응답을 구문 분석 한 다음 응답을 브라우저에 전달합니다.Java HTTPS 연결 전달

// Accept connection from browser and read request 
1. Socket browserConnection = serverSocket.accept(); 
2. browserConnection.getInputStream().read(buffer); 
3. SocketInetAddress destInetAddress = parseHttpRequest(buffer); 

// Connect to destination and forward request 
4. Socket destConnection = new Socket(destInetAddress); 
5. destConnection.getOutputStream().write(buffer); 

// Read response from destination 
6. destConnection.getInputStream().read(buffer); 
7. parseHttpResponse(buffer); 

// Forward response to browser 
8. browserConnection.getOutputStream().write(buffer); 

이 HTTP 연결 잘 작동하지만, 내가 HTTPS 연결을 connection reset을 받고 있어요 다음과 같이

이 작업의 의사 코드이다.

참고 : HTTP와는 달리, 그 다음 몇 가지 receives 단 한 번 send 아니다 것을 내가, HTTP 및 HTTPS 연결의 차이를 알고있다. 내 코드는 HTTPS reads만큼 필요하고, 또한 writes만큼 필요하다.

모든 HTTPS 서버 (예 : https://www.google.com, https://www.comodo.com 등)에서 연결 재설정을받는 이유는 무엇입니까?!

답변

0

HTTPS 프록시를 사용하면 브라우저에서 CONNECT 명령을 보내 프록시가 대상 서버 (예 : https://www.google.com)에 TCP 연결을 설정합니다. 프록시가 연결을 설정하면 OK 메시지를 브라우저에 반환합니다. 그런 다음 브라우저는 대상 서버와의 SSL 핸드 셰이크를 시작하여 암호화 된 데이터 전송을 시작합니다. 프록시가 데이터를 간섭하지 않아야합니다. 프록시가 수행해야하는 모든 작업은 브라우저와 대상 서버간에 바이트 흐름을 릴레이하는 것입니다.

0

HTTPS는 man-in-the-middle 공격을 방지하기 위해 보안이 유지됩니다. 당신이 말하는 것은 그것이 합법적이든 아니든간에 중간자 공격이 어떻게 생겼는지입니다. HTTPS를 사용하면 다른 대상을위한 패킷을 가로 채고 읽을 수 없습니다. 그러나 패킷을 사용자에게 보내고, 클라이언트에 보안 인증서를 제공하고, 패킷을 디코딩하고, 원하는대로 수행하고, 다시 인코딩하고, 다른 대상으로 전달할 수 있습니다. 차이점은 고객이 당신과 당신이 누구인지를 알아야한다는 것입니다. 그렇지 않으면 HTTPS를 사용하여 사용자와 통신 할 수 없습니다.

+1

이 답변은 해결책으로 표시되었지만 더 많은 실험을 거쳐 오해의 소지가있는 것으로 판명되었으므로 마크를 제거해야합니다. 해결책은 SSL 소켓을 사용하지 않는 것입니다 ... 해결책을 설명 할 것입니다. 나중에 자세히. –