CN=hostname
openssl 1.0.1+가 설치된 Enterprise Linux 시스템은 인증서의 값이 인증서가 있는 서버와 일치하는지 어떻게 확인합니까 ? 해당 SSL 웹 애플리케이션을 수신하는 어댑터의 IP 주소에 대해 기존의 일반 역방향 DNS 조회를 사용합니까? gethostname 라이브러리 기능을 사용합니까? /etc/hosts 파일을 읽습니까? nsswitch.conf가 일부 역할을 합니까?
업데이트: 다른 사람과 대화한 후에는 이 모든 작업이 브라우저/클라이언트 측에서 수행된 것으로 보입니다. URL의 호스트 부분이 해당 애플리케이션에 설치된 인증서의 CN 값과 일치하는 한 브라우저는 만족합니다. 맞습니까?
답변1
예, 설명하신 내용은 기술적으로는 정확하지만 조금 더 많은 일이 진행되고 있습니다. 브라우저는 몇 가지 지표를 기반으로 호스트의 CN이 올바른지 확인합니다.
기본 표시는 HTTPS 트래픽의 SSL 인증서를 제공하는 호스트가 올바른 도메인에서 제공되고 있으며 인증서의 서명 체인도 인증서를 발급하고 체인 서명한 CA(인증 기관)를 기반으로 정확하다는 것입니다.
openssl
를 사용하면 s_client
브라우저가 수행하는 과정을 앞뒤로 이해할 수 있습니다.
예
$ openssl s_client -connect encrypted.google.com:443 < /dev/null | head -10
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com
verify return:1
CONNECTED(00000003)
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
...
...
DONE
이 명령을 사용하면 SSL 인증서를 생성할 때 사용된 CN을 확인할 수 있습니다.
$ openssl s_client -connect encrypted.google.com:443 < /dev/null|& grep "CN.*google"
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
따라서 브라우저는 이 인증서를 제공하는 호스트 이름이 CN=...
인증서에 포함된 계층 구조 내에 속하는지 확인합니다.
SNI
예전에는 HTTPS를 통해 사용하려는 각 SSL 서버의 호스트 이름에 대해 특정 IP 주소를 별도로 설정해야 했습니다. 그러나 SNI(Server Name Indication) 덕분에 더 이상 그렇지 않습니다.
발췌
이는 사이트에 IP 주소당 하나의 SSL 인증서가 설치된 경우 매우 효과적입니다(이전에는 엄격한 요구 사항이었습니다). SNI(서버 이름 표시)를 사용하면 웹 서버에 동일한 IP 주소에 여러 SSL 인증서를 설치할 수 있습니다. SNI 지원 브라우저는 초기 핸드셰이크 프로세스 중에 도달하려는 서버의 호스트 이름을 지정합니다. 이를 통해 웹 서버는 연결에 사용할 올바른 SSL 인증서를 결정할 수 있습니다.
다시 사용하면 openssl
이 시나리오에서 브라우저가 수행할 작업을 시뮬레이션할 수 있습니다.
$ openssl s_client -connect someserver:443 -servername sslsite-example.com
발췌
SSL 협상은 HTTP 요청을 원격 서버로 보내기 전에 이루어져야 합니다. 즉, 브라우저와 서버는 프로세스 초기에 인증서 교환을 수행해야 하며 브라우저는 도달하려는 사이트를 지정할 기회를 얻지 못합니다. SNI는 SSL 협상 프로세스 중에 Host: 헤더 유형의 교환을 허용하여 이 문제를 해결합니다.