回答:
SNIはクライアントによって開始されるため、SNIをサポートするクライアントが必要です。Windows XPを使用している場合を除き、ブラウザで実行できます。クライアントでSSL接続を適切にデバッグできる場合(悲しいことに、gnutls / openssl CLIコマンドでもできない)、サーバーが拡張helloのserver_nameフィールドを送り返すかどうかを確認できます。このフィールドが存在しないということは、サーバーがクライアントhelloでserver_nameを使用して証明書を選択しなかったことを意味しているだけであり、証明書をサポートしていないことを意味します。
したがって、実際には、最も簡単なテストは接続を試すことです。このためには、SSL接続が可能な同じIPに解決される2つの名前を知る必要があります。httpsは最も簡単です。両方の名前を参照して、正しい証明書が提示されているかどうかを確認するだけです。
3つの結果があります。
より多くの情報を生成する少し複雑なテストは、wiresharkを開いてブラウジング中にキャプチャすることです。その後、ssl.handshakeでフィルタリングすることにより、関連するパケットを見つけることができます。以下のスクリーンショットは、SNIがサポートされているクライアントhello /サーバーhelloペアの例です。
繰り返しますが、もちろん、サーバーhelloにserver_nameフィールドがないことは、SNIがサポートされていないことを示すものではありません。使用する証明書を決定する際に、クライアントが提供したserver_nameが使用されなかったことだけです。
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アドレスです。
コマンドラインの使用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
に加えて、「アラート」の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テスト中に与えられます。