サーバーがHTTPSにSNIを使用しているかどうかを検出するにはどうすればよいですか?


41

サーバーがWebサイト上のHTTPS証明書にサーバー名表示SSL拡張を使用しているかどうかを知る簡単な方法を探しています。ブラウザまたはUnixコマンドラインのいずれかを使用する方法で十分です。

ありがとう!

回答:


20

SNIはクライアントによって開始されるため、SNIをサポートするクライアントが必要です。Windows XPを使用している場合を除き、ブラウザで実行できます。クライアントでSSL接続を適切にデバッグできる場合(悲しいことに、gnutls / openssl CLIコマンドでもできない)、サーバーが拡張helloのserver_nameフィールドを送り返すかどうかを確認できます。このフィールドが存在しないということは、サーバーがクライアントhelloでserver_nameを使用して証明書を選択しなかったことを意味しているだけであり、証明書をサポートしていないことを意味します。

したがって、実際には、最も簡単なテストは接続を試すことです。このためには、SSL接続が可能な同じIPに解決される2つの名前を知る必要があります。httpsは最も簡単です。両方の名前を参照して、正しい証明書が提示されているかどうかを確認するだけです。

3つの結果があります。

  • 両方の名前をカバーするワイルドカード証明書(またはsubjectAltNameを持つ証明書)を取得します。何も学習しません
  • 少なくとも1つの証明書が間違っています。サーバーがSNIをサポートしていないか、正しく構成されていません。
  • 両方とも正しい名前の2つの異なる証明書を取得します。SNIがサポートされ、正しく構成されています。

より多くの情報を生成する少し複雑なテストは、wiresharkを開いてブラウジング中にキャプチャすることです。その後、ssl.handshakeでフィルタリングすることにより、関連するパケットを見つけることができます。以下のスクリーンショットは、SNIがサポートされているクライアントhello /サーバー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テスト中に与えられます。
ディアハンター

ああ、私はマンページでそれを見逃した。追加していただきありがとうございます。
デニスカースメーカー

26

SSL / TLS Server Name Indication拡張ヘッダーの存在を検出するためにおそらく探しているライナーは次のとおりです。

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アドレスです。

コマンドラインの使用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_clientというTLS拡張を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に加えて、「アラート」のgrep を渡す必要があります。場合は-servername間違っている、あなたのようなものでしょうTLS 1.2 Alert ... warning unrecognized_nameサーバーからを。@Meitar答えにそれを追加すれば、他の人にも役立つと思います。
ヴィクトルノノフ

@ViktorNonov -msgスイッチは、TLSプロトコルメッセージの16進ダンプを追加するだけです。TLSハンドシェイクエラーを監視する必要はないため、この回答に追加するのは誤りです。さらに、このようなTLSハンドシェイクエラーはSTDOUTに出力されます。これは、そもそも2>/dev/null処理されるために回答から削除する必要があることを意味しgrepます。@bsheaが実際に求めているのは、「TLSエラーを検出する方法」です。これは、「このサーバーはTLSプロトコルのSNI機能を利用していますか?」という質問とまったく異なる質問です。これがここのトピックです。
マイター

@ Meitar、TLSハンドシェイクメッセージを観察する別の方法を見つけることができませんでした。またSTDERR、ファイルをテキストファイルにリダイレクトしても、そこでエラーは発生しません。なし-msgでは、ハンドシェイクメッセージを表示する他のオプションは見つかりませんでした。(openssl 1.0.2qを使用)。答えとの関連性がある限り、あなたは正しいかもしれません。
ヴィクトルノノフ

-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名を示しています。
スパッツ

4
証明書内のSANとサーバー上のSNIサポートは別のものです。HTTPS仮想ホスティングにSANを使用することは、SNIより前のハッキングのようなものです。SNIでは、サーバーがクライアントの名前付けの期待に一致する個々の証明書を選択できるため、SANでの証明書は必要ありません。
mr.spuratic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.