Apache가 수신 대기중인 TCP 포트 중 하나에 대한 요청을 수신 할 때 (예 : 80, 443) HTTP 헤더를보고 어떤 호스트가 요청되는지 결정할 것입니다 Host
. 그러면 서버는 요청을 리디렉션 할 가상 호스트를 알게됩니다.
그러나 SSL을 통한 HTTP / TLS에서 어떻게 작동합니까? 전체 HTTP 요청이 암호화되고 있기 때문에 (적어도 내가 어딘가 읽은 것으로 생각됩니다) 헤더 정보는 서버가 데이터를 해독 한 후에 만 읽을 수 있습니다. 그러나 암호를 해독하려면 웹 서버에 여러 SSL 인증서를 설치할 수 있으므로 사용할 키 페어를 알아야합니다.
그렇다면 서버는 암호 해독에 필요한 키를 어떻게 알 수 있습니까?
내 추측 :
TLS 핸드 셰이크가 필요한 정보를 제공한다고 상상할 수 있습니다.
“가능한 복제” 플래그 와 관련하여 :
나는 연결된 질문과 내 질문에 대한 답변 이 비슷하다는 것에 동의하지만 질문이 다르다고 말해야합니다. 독립 SSL 인증서로 여러 사이트를 호스팅 할 수 있는지 여부에 대해서는 의문의 여지가 없습니다. 대신 내 질문은 근본적인 기술적 측면을 다룹니다.
답변
원래 웹 서버는 몰랐습니다. 서버에서 호스트하려는 모든 SSL 가상 호스트에 대해 별도의 IP 주소가 필요한 이유입니다. 이런 식으로, 서버는 IP X에 연결될 때 관련 호스트에 대한 구성 (인증서 포함)을 사용해야한다는 것을 알았습니다.
이것은 실제로 클라이언트가 핸드 쉐이킹 프로세스에서 필요한 호스트 이름을 표시 할 수 있도록하는 TLS 확장 인 Server Name Indication으로 변경되었습니다 . 이 확장은 모든 최신 OS에서 사용되지만 이전 브라우저 또는 서버는이를 지원하지 않으므로 클라이언트가 WinXP에서 여전히 IE 6을 사용할 것으로 예상되면 운이 나쁠 것입니다.
답변
TLS / SSL에 대한 오해가있는 것 같습니다. HTTP 요청은 서버의 공개 키로 암호화되지 않습니다. 이전 핸드 셰이크에서 협상 된 키를 사용하여 대칭 암호로 암호화됩니다.
TLS 핸드 셰이크에 대한 간략한 설명 : 서버와 클라이언트는 암호 모음, 대칭 키 및 기타 세부 사항을 협상합니다. MITM을 방지하기 위해 서버는 일반적으로 인증서 (체인)를 클라이언트로 보내고 인증서의 키를 사용하여 핸드 셰이크를 인증합니다. (클라이언트 인증 또는 TLS-PSK와 같은 다른 변형도 있지만 HTTP에는 많이 사용되지 않습니다.) 클라이언트는 인증서의 유효성을 검사하거나 (일반적인 방법으로) 무시할 수 있습니다.
하나의 IP에서 여러 TLS 인증서를 사용할 때는 SNI가 중요하지만 서버가 요청을 해독 할 수있는 것은 아닙니다. SNI가 없으면 서버는 어떤 인증서 체인을 보내야하는지 알지 못하므로 서버는 일반적으로 하나를 선택합니다 (예 : 첫 번째 호스트). 물론 잘못된 것일 수 있습니다. 서버가 잘못된 인증서 체인을 선택하면 클라이언트는이를 거부해야합니다 (따라서 HTTP 요청 전송을 계속하지 않음). 그러나 클라이언트가 인증서를 무시하거나 유효하지 않은 인증서가이 사이트에 대해 신뢰 된 것으로 표시되면 계속 진행할 수 있습니다. 암호화에 사용되는 대칭 키는 인증서에 의존하지 않기 때문에 (TLS는 인증서 없이도 작동하도록 설계됨) 서버는이를 해독 할 수 있습니다.
SSL에 대해 질문하는 동안 TLS에 대해 쓰는 이유를 조금만 참고하십시오. TLS는 SSL의 새로운 버전입니다. SSL의 모든 버전은 일반적인 용도로는 안전하지 않은 것으로 간주되므로 현재 대부분 TLS (1.0, 1.1, 1.2)를 사용하고 있습니다.