일반 HTTP 프록시를 통해 ssl::stream<tcp::socket>를 사용할 때는 대상으로 TLS를 요청하기 전에 원시 전송 계층을 사용합니다:

auto& transport = tlsStream.next_layer();
  1. 그 전송 계층을 프록시 호스트와 포트에 연결합니다. 프록시 자격 증명을 설정하지 않은 허용된 공개 HTTPS 대상의 경우 HTTP 프록시 목록이 후보 엔드포인트를 제공합니다. 후보가 요청한 터널을 허용하는지 확인하십시오.
  2. 대상의 authority를 지정해 CONNECT를 보내고, 예를 들어 api.example:443처럼 하며, 원시 전송 계층에서 전체 응답 헤더를 분석합니다. 성공한 2xx는 터널을 엽니다. 거부는 HTTP 프록시 응답으로 남습니다.
  3. 대상 호스트 이름, 필요한 SNI, 신뢰 루트, 피어 검증을 구성한 다음 tlsStream에서 클라이언트 핸드셰이크를 시작합니다.
  4. TLS가 성공하면 애플리케이션에는 SSL 스트림 읽기와 쓰기를 사용합니다. 그 시점에 다음 계층을 직접 읽으면 TLS 처리를 우회합니다.

HTTP 파서의 잔여 데이터는 다음 단계로 넘기십시오. Asio에는 버퍼링된 핸드셰이크 오버로드가 있습니다. 파서가 소유한 꼬리를 버리면 소켓에서 이미 읽은 바이트를 잃을 수 있습니다.

이 단순한 형식에서는 next_layer와 lowest_layer 모두 TCP에 도달합니다. 래퍼가 많아지면 둘이 달라질 수 있으므로 프록시의 실제 와이어 프로토콜을 운반하는 인터페이스를 선택하십시오. HTTPS 프록시는 TLS 단계를 하나 더 추가하며 이 평문 CONNECT 순서 밖에 있습니다.

관련 글