Asio TLS 핸드셰이크를 시작하기 전에 CONNECT 설정하기
일반 HTTP 프록시 교환에는 Asio SSL 스트림의 다음 계층을 사용하고, 그다음 수락된 터널로 TLS를 시작합니다.
일반 HTTP 프록시를 통해 ssl::stream<tcp::socket>를 사용할 때는 대상으로 TLS를 요청하기 전에 원시 전송 계층을 사용합니다:
auto& transport = tlsStream.next_layer();- 그 전송 계층을 프록시 호스트와 포트에 연결합니다. 프록시 자격 증명을 설정하지 않은 허용된 공개 HTTPS 대상의 경우 HTTP 프록시 목록이 후보 엔드포인트를 제공합니다. 후보가 요청한 터널을 허용하는지 확인하십시오.
- 대상의 authority를 지정해 CONNECT를 보내고, 예를 들어
api.example:443처럼 하며, 원시 전송 계층에서 전체 응답 헤더를 분석합니다. 성공한 2xx는 터널을 엽니다. 거부는 HTTP 프록시 응답으로 남습니다. - 대상 호스트 이름, 필요한 SNI, 신뢰 루트, 피어 검증을 구성한 다음
tlsStream에서 클라이언트 핸드셰이크를 시작합니다. - TLS가 성공하면 애플리케이션에는 SSL 스트림 읽기와 쓰기를 사용합니다. 그 시점에 다음 계층을 직접 읽으면 TLS 처리를 우회합니다.
HTTP 파서의 잔여 데이터는 다음 단계로 넘기십시오. Asio에는 버퍼링된 핸드셰이크 오버로드가 있습니다. 파서가 소유한 꼬리를 버리면 소켓에서 이미 읽은 바이트를 잃을 수 있습니다.
이 단순한 형식에서는 next_layer와 lowest_layer 모두 TCP에 도달합니다. 래퍼가 많아지면 둘이 달라질 수 있으므로 프록시의 실제 와이어 프로토콜을 운반하는 인터페이스를 선택하십시오. HTTPS 프록시는 TLS 단계를 하나 더 추가하며 이 평문 CONNECT 순서 밖에 있습니다.