답변:
SNI는 클라이언트에 의해 시작되므로이를 지원하는 클라이언트가 필요합니다. Windows XP를 사용하지 않는 한 브라우저가 작동합니다. 클라이언트가 SSL 연결을 제대로 디버깅 할 수 있다면 (슬프게도, gnutls / openssl CLI 명령조차도 그렇지 않음), 서버가 확장 hello에서 server_name 필드를 다시 보내는 지 여부를 확인할 수 있습니다. 이 필드가 없다는 것은 서버가 클라이언트 hello에서 server_name을 사용하여 인증서를 선택하는 데 도움이 아니라 인증서를 선택하지 않았 음을 의미합니다.
따라서 실제로 가장 쉬운 테스트는 단순히 연결을 시도하는 것입니다. 이를 위해서는 SSL 연결을 만들 수있는 동일한 IP로 확인되는 두 가지 이름을 알아야합니다. https는 가장 쉬운 방법입니다. 두 이름을 모두 탐색하고 올바른 인증서가 제공되는지 확인할 수 있습니다.
세 가지 결과가 있습니다.
더 많은 정보를 얻을 수있는 약간 더 복잡한 테스트는 검색하는 동안 wireshark를 열고 캡처하는 것입니다. 그런 다음 ssl.handshake를 필터링하여 관련 패킷을 찾을 수 있습니다. 아래 스크린 샷은 SNI가 지원되는 클라이언트 hello / server hello 쌍의 예입니다.
물론 서버 hello에 server_name 필드가 없다는 것은 SNI가 지원되지 않음을 나타내지 않습니다. 클라이언트가 제공 한 server_name이 사용할 인증서를 결정하는 데 사용되지 않았을뿐입니다.
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.com
TLS 가능 서버의 도메인 이름 또는 IP 주소입니다.
명령 행은 openssl
의 s_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_client
TLS 확장 디버깅 출력 에 "서버 이름"이라는 TLS 확장을 표시합니다 .
다음과 같은 출력 라인이 보이면
TLS server extension "server name" (id=0), len=0
서버는 ServerHello 응답으로 SNI 헤더 정보를 반환합니다. 그렇지 않은 경우 서버가 SNI를 지원하지 않거나 요청한 이름이 지정된 SNI 정보를 반환하도록 구성되지 않았을 수 있습니다. 이 경우 -servername
서버가 SNI 정보로 응답해야하는 옵션 에서 도메인 이름을 사용하고 있는지 다시 확인하십시오 .
-servername
. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere
= TLS server extension "server name" (id=0), len=0
(그리고 일치하는 경우 동일한 출력). 출력에서 서버의 호스트와 일치하지 않는지 어떻게 확인합니까?
-msg
위의 매개 변수 외에도 "Alert"를 grep해야합니다. (가) 경우 -servername
잘못 당신은 같은 것을 얻을 것이다 TLS 1.2 Alert ... warning unrecognized_name
서버에서합니다. @Meitar 나는 당신이 대답에 그것을 추가하면 다른 사람들에게 유용 할 것이라고 생각합니다.
-msg
스위치는 단순히 TLS 프로토콜 메시지의 16 진 덤프를 추가합니다. TLS 핸드 셰이크 오류를 관찰 할 필요가 없으므로이 답변에 추가하는 것은 올바르지 않습니다. 또한 이와 같은 TLS 핸드 셰이크 오류는 STDOUT에 인쇄됩니다 . 즉, 처음에 2>/dev/null
처리하려면 응답에서 오류를 제거해야합니다 grep
. @bshea가 실제로 요구하는 것은 "TLS 오류를 어떻게 감지합니까?"입니다. "이 서버가 TLS 프로토콜의 SNI 기능을 사용합니까?"라는 질문과는 완전히 다른 질문입니다. 이것이 여기 주제입니다.
STDERR
텍스트 파일로 리디렉션하더라도 오류가 발생하지 않습니다. -msg
내가 없으면 악수 메시지를 보여주는 다른 옵션을 찾을 수 없었습니다. (openssl 1.0.2q 사용). 답과 관련이 있다면 당신이 옳을 수도 있습니다.
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
DNS:...
마지막 행 의 항목은 인증서의 모든 유효한 SNI 이름을 보여줍니다.
openssl
. 일부 세부 사항이 사용 가능합니다.openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443
SNI 사용에 대한 일부 표시는 Qualys SSL 테스트 중에 제공됩니다 .