サーバーがWebサイト上のHTTPS証明書にサーバー名表示SSL拡張機能を使用しているかどうかを確認する簡単な方法を探しています。ブラウザまたはUnixコマンドラインを使用する方法で問題ありません。
ありがとう!
SNIはクライアントによって開始されるため、SNIをサポートするクライアントが必要です。 Windows XPを使用している場合を除き、ブラウザで実行できます。クライアントでSSL接続を正しくデバッグできる場合(残念ながら、gnutls/openssl CLIコマンドでもできない)、サーバーが拡張helloのserver_nameフィールドを送り返すかどうかを確認できます。このフィールドがないことは、サーバーが証明書を選択するためにクライアントhelloでserver_nameを使用しなかったことを意味するだけであり、証明書をサポートしていないことを意味しません。
そのため、実際には、最も簡単なテストは単に接続を試すことです。これを行うには、同じIPに解決される2つの名前を知っている必要があります。これには、ssl接続を確立できます。 httpsは、両方の名前を参照して、正しい証明書が提示されているかどうかを確認できるため、最も簡単です。
3つの結果があります。
より多くの情報を生成するもう少し複雑なテストは、閲覧中にwiresharkを開いてキャプチャすることです。次に、ssl.handshakeをフィルタリングすることで、関連するパケットを見つけることができます。以下のスクリーンショットは、SNIがサポートされているclient 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情報を返すように構成されていない可能性があります。この場合、サーバーがSNI情報で応答する必要がある-servername
オプションでドメイン名を使用していることを再確認してください。