서버가 HTTPS에 SNI를 사용하고 있는지 어떻게 알 수 있습니까?


41

서버가 웹 사이트의 HTTPS 인증서에 서버 이름 표시 SSL 확장을 사용하고 있는지 알 수있는 간단한 방법을 찾고 있습니다. 브라우저 나 Unix 명령 행을 사용하는 방법이 좋습니다.

감사!

답변:


20

SNI는 클라이언트에 의해 시작되므로이를 지원하는 클라이언트가 필요합니다. Windows XP를 사용하지 않는 한 브라우저가 작동합니다. 클라이언트가 SSL 연결을 제대로 디버깅 할 수 있다면 (슬프게도, gnutls / openssl CLI 명령조차도 그렇지 않음), 서버가 확장 hello에서 server_name 필드를 다시 보내는 지 여부를 확인할 수 있습니다. 이 필드가 없다는 것은 서버가 클라이언트 hello에서 server_name을 사용하여 인증서를 선택하는 데 도움이 아니라 인증서를 선택하지 않았 음을 의미합니다.

따라서 실제로 가장 쉬운 테스트는 단순히 연결을 시도하는 것입니다. 이를 위해서는 SSL 연결을 만들 수있는 동일한 IP로 확인되는 두 가지 이름을 알아야합니다. https는 가장 쉬운 방법입니다. 두 이름을 모두 탐색하고 올바른 인증서가 제공되는지 확인할 수 있습니다.

세 가지 결과가 있습니다.

  • 두 이름을 모두 포함하는 와일드 카드 인증서 (또는 subjectAltName이있는 인증서)를받습니다. 아무 것도 배우지 않습니다.
  • 서버 중 하나 이상에 대해 잘못된 인증서를받습니다. 서버가 SNI를 지원하지 않거나 잘못 구성되었습니다.
  • 올바른 이름에 대해 두 가지 다른 인증서가 제공됩니다. SNI가 지원되고 올바르게 구성되었습니다.

더 많은 정보를 얻을 수있는 약간 더 복잡한 테스트는 검색하는 동안 wireshark를 열고 캡처하는 것입니다. 그런 다음 ssl.handshake를 필터링하여 관련 패킷을 찾을 수 있습니다. 아래 스크린 샷은 SNI가 지원되는 클라이언트 hello / server hello 쌍의 예입니다.

고객 안녕하세요 서버 안녕하세요

물론 서버 hello에 server_name 필드가 없다는 것은 SNI가 지원되지 않음을 나타내지 않습니다. 클라이언트가 제공 한 server_name이 사용할 인증서를 결정하는 데 사용되지 않았을뿐입니다.


9
데니스-동의하지 않습니다 openssl. 일부 세부 사항이 사용 가능합니다. openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443SNI 사용에 대한 일부 표시는 Qualys SSL 테스트 중에 제공됩니다 .
사슴 사냥꾼

아, 맨 페이지에서 그것을 놓쳤다. 추가해 주셔서 감사합니다.
Dennis Kaarsemaker 17 년

26

SSL / TLS 서버 이름 표시 확장 헤더가 있는지 감지하려는 라이너는 다음과 같습니다.

openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"

여기서 www.SERVERNAME.com테스트중인 SNI 값은 테스트중인 www.YOURSERVER.comTLS 가능 서버의 도메인 이름 또는 IP 주소입니다.

명령 행은 openssls_client( s_client (1) 참조 )를 사용하여 www.YOURSERVER.com포트 의 서버 에 연결 443합니다. 이 -tlsextdebug옵션은 TLS 확장 디버깅 출력을 켭니다. 이 -servername옵션은 TLS 핸드 셰이크 동안 ClientHello 패킷의 SNI 필드 값으로 s_client프로그램에 전달 하도록 프로그램에 지시합니다 www.SERVERNAME.com.

마지막으로 2>/dev/null단순히 stderr 출력 (숨겨 질 수 있음)을 숨기고 | grep "server name"파이프 라인은 stdout을 필터링하여 s_clientTLS 확장 디버깅 출력 에 "서버 이름"이라는 TLS 확장을 표시합니다 .

다음과 같은 출력 라인이 보이면

TLS server extension "server name" (id=0), len=0

서버는 ServerHello 응답으로 SNI 헤더 정보를 반환합니다. 그렇지 않은 경우 서버가 SNI를 지원하지 않거나 요청한 이름이 지정된 SNI 정보를 반환하도록 구성되지 않았을 수 있습니다. 이 경우 -servername서버가 SNI 정보로 응답해야하는 옵션 에서 도메인 이름을 사용하고 있는지 다시 확인하십시오 .


1
올바른 사용 여부에 관계없이 출력은 동일합니다 -servername. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(그리고 일치하는 경우 동일한 출력). 출력에서 ​​서버의 호스트와 일치하지 않는지 어떻게 확인합니까?
bshea

1
@bshea -msg위의 매개 변수 외에도 "Alert"를 grep해야합니다. (가) 경우 -servername잘못 당신은 같은 것을 얻을 것이다 TLS 1.2 Alert ... warning unrecognized_name서버에서합니다. @Meitar 나는 당신이 대답에 그것을 추가하면 다른 사람들에게 유용 할 것이라고 생각합니다.
Viktor Nonov

@ViktorNonov -msg스위치는 단순히 TLS 프로토콜 메시지의 16 진 덤프를 추가합니다. TLS 핸드 셰이크 오류를 관찰 할 필요가 없으므로이 답변에 추가하는 것은 올바르지 않습니다. 또한 이와 같은 TLS 핸드 셰이크 오류는 STDOUT에 인쇄됩니다 . 즉, 처음에 2>/dev/null처리하려면 응답에서 오류를 제거해야합니다 grep. @bshea가 실제로 요구하는 것은 "TLS 오류를 어떻게 감지합니까?"입니다. "이 서버가 TLS 프로토콜의 SNI 기능을 사용합니까?"라는 질문과는 완전히 다른 질문입니다. 이것이 여기 주제입니다.
메이 타르

@Meitar, TLS 핸드 셰이크 메시지를 관찰하는 다른 방법을 찾지 못했습니다. 또한 STDERR텍스트 파일로 리디렉션하더라도 오류가 발생하지 않습니다. -msg내가 없으면 악수 메시지를 보여주는 다른 옵션을 찾을 수 없었습니다. (openssl 1.0.2q 사용). 답과 관련이 있다면 당신이 옳을 수도 있습니다.
Viktor Nonov

-2

openssl인증서를 가져오고 쿼리하는 데 사용할 수 있습니다 .

  • 인증서를 가져와 openssl s_client -connect
  • 인증서를 파싱하다 openssl x509
  • grep "DNS :"정보를 찾으려면

openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:

% openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = BM, O = QuoVadis Limited, CN = QuoVadis Global SSL ICA G2
verify return:1
depth=0 C = CH, ST = Zuerich, L = Zuerich, O = Kaspar Brand, CN = alice.sni.velox.ch
verify return:1
                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

마지막 줄에는 인증서에있는 모든 SNI 항목이 표시됩니다.

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

그 결과물에서 무엇을 찾고 있습니까? 여러 도메인이 존재한다는 사실?
spookylukey

DNS:... 마지막 행 의 항목은 인증서의 모든 유효한 SNI 이름을 보여줍니다.
spazm

4
인증서의 SAN과 서버의 SNI 지원은 서로 다릅니다. HTTPS 가상 호스팅에 SAN을 사용하는 것은 SNI보다 먼저 해킹 된 것입니다. SNI의 경우 서버가 클라이언트 이름 지정 기대와 일치하는 개별 인증서를 선택할 수 있으므로 SAN이있는 인증서가 필요하지 않습니다.
mr.spuratic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.