web-dev-qa-db-ja.com

サーバーがHTTPSにSNIを使用しているかどうかをどのように検出できますか?

サーバーがWebサイト上のHTTPS証明書にサーバー名表示SSL拡張機能を使用しているかどうかを確認する簡単な方法を探しています。ブラウザまたはUnixコマンドラインを使用する方法で問題ありません。

ありがとう!

44
spookylukey

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

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

3つの結果があります。

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

より多くの情報を生成するもう少し複雑なテストは、閲覧中にwiresharkを開いてキャプチャすることです。次に、ssl.handshakeをフィルタリングすることで、関連するパケットを見つけることができます。以下のスクリーンショットは、SNIがサポートされているclient hello/server helloペアの例です。

Client helloServer hello

繰り返しますが、もちろん、サーバーhelloにserver_nameフィールドがなくても、SNIがサポートされていないことを示しているわけではありません。単に、使用する証明書を決定する際に、クライアントが提供したserver_nameが使用されなかっただけです。

23

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

コマンドラインはopenssls_clients_client(1) を参照)を使用して、ポートwww.YOURSERVER.com443でサーバーに接続します。 -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オプションでドメイン名を使用していることを再確認してください。

30
Meitar