web-dev-qa-db-ja.com

非SNIブラウザ(SNIサポートなし)をシミュレートする方法は?

同じサーバー上にある(したがって同じIPアドレスを共有している)異なるドメインに対して、いくつかの異なるSSL証明書を使用してApacheをセットアップしています。

Qualys SSL Test で、SNI拡張機能をサポートしていないクライアント(つまり、 2013年12月現在のBingBot )があることを発見しました。

そのようなクライアントの要求を収集できる特別なデフォルトのWebアプリケーションを作成することを考えていますが、どうすればそれらのクライアントをシミュレートできますか?

私はWindows8を使用しており、Linuxボックスにアクセスできません。

19
watery

最も一般的に使用されているSSLライブラリであるOpenSSLを使用できます。 Windowsバイナリをダウンロードできます。

openssl s_client -connect domain.com:443コマンドは、クライアント側からのSSL接続をテストするのに非常に役立ちます。デフォルトではSNIをサポートしていません。 -servername domain.com引数を追加して、SNIを有効にすることができます。

19
zakjan

Openssls_clientと同様にgnutls-cliです

gnutls-cli --disable-sni www.google.com
4
Stephen Baynes

特別なデフォルトのWebアプリケーションを使用するアプローチは単に機能しません。

限られたクライアントが別のページを開くだけでなく、完全に失敗するため、これを行うことはできません。

  1. 非SNIクライアントが問題なく開く「デフォルト」の仮想ホストがあると考えてください。

  2. また、SNIをサポートするクライアントによって開かれることになっている追加の仮想ホストがあります。

  3. 明らかに、これら2つは異なるホスト名(たとえば、default.example.comwww.example.com)を持っている必要があります。そうでない場合、Apacheまたはnginxは、どの接続クライアントにどのサイトを表示するかを知りません。

これで、SNI以外のクライアントがhttps://www.example.comを開こうとすると、default.example.comからの証明書が提示され、証明書エラーが発生します。これは大きな注意点です。

このエラーの修正は、www.example.comdefault.example.comの両方を含むSAN(マルチドメイン)証明書を作成することです。その後、非SNIクライアントがhttps://www.example.comを開こうとすると、次のようになります。有効な証明書が提示されますが、それでも彼のHost:ヘッダーはwww.example.comを指し、彼のリクエストはdefault.example.comではなくwww.example.comにルーティングされます。

ご覧のとおり、SNI以外のクライアントを完全にブロックするか、予期される仮想ホストに転送します。 デフォルトのWebアプリケーションには賢明なオプションはありません。

2
sanmai

OpenSSL 1.1.0以前のバージョンを使用している場合は、openssl s_client -connect $ip:$portを使用すると、OpenSSLはSNI拡張機能を有効にしません。

OpenSSL 1.1.1を使用している場合は、-noservernameフラグをopenssl s_clientに追加する必要があります。

2
Hardrain

Strawberry Perl をインストールしてから、次のスクリプトを使用して、SNIをサポートしていないクライアントをシミュレートできます。

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new(ssl_opts => {
    # this disables SNI
    SSL_hostname => '', 
    # These disable certificate verification, so that we get a connection even
    # if the certificate does not match the requested Host or is invalid.
    # Do not use in production code !!!
    SSL_verify_mode => 0,
    verify_hostname => 0,
});

# request some data
my $res = $ua->get('https://example.com');

# show headers
# pseudo header Client-SSL-Cert-Subject gives information about the
# peers certificate
print $res->headers_as_string;

# show response including header
# print $res->as_string;

SSL_hostnameを空の文字列に設定すると、SNIを無効にできます。この行を無効にすると、SNIが再び有効になります。

1
Steffen Ullrich