openssl 1.0.1+ を搭載した Enterprise Linux システムは、CN=hostname
証明書の値が、証明書が存在するサーバーと一致することをどのように確認するのでしょうか。SSL Web アプリケーションをリッスンしているアダプターの IP アドレスに対して、従来の単純な逆 DNS ルックアップを使用するのでしょうか。gethostname ライブラリ関数を使用するのでしょうか。/etc/hosts ファイルを読み取りますか。nsswitch.conf が役割を果たしますか。
アップデート: 他の人と話した後、これはすべてブラウザ/クライアント側で行われるようです。URL のホスト部分がそのアプリケーション用にインストールされている証明書の CN 値と一致している限り、ブラウザは問題なく動作します。それでいいですか?
答え1
はい、あなたが説明したことは技術的には正しいのですが、もう少しだけ別のことが起こっています。ブラウザは、いくつかの指標に基づいて、ホストの CN が正しいことを判断しています。
主な兆候は、HTTPS トラフィックの SSL 証明書を提供するホストが正しいドメインから提供されており、証明書を発行してチェーン署名した CA (証明機関) に基づいて証明書の署名チェーンも正しいことです。
openssl
's を使用するs_client
と、ブラウザが実行するやり取りを把握できます。
例
$ openssl s_client -connect encrypted.google.com:443 < /dev/null | head -10
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com
verify return:1
CONNECTED(00000003)
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
i:/C=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
...
...
DONE
このコマンドを使用すると、SSL 証明書の生成時に使用された CN がわかります。
$ openssl s_client -connect encrypted.google.com:443 < /dev/null|& grep "CN.*google"
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = *.google.com
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
CN=...
したがって、ブラウザは、この証明書を提供しているホスト名が、証明書に含まれている階層内にあることを確認します。
スニ
以前は、HTTPS 経由で使用したい SSL サーバーのホスト名ごとに特定の IP アドレスを確保する必要がありました。しかし、SNI (Server Name Indication) のおかげで、これはもう必要ありません。
抜粋
これは、サイトに IP アドレスごとに 1 つの SSL 証明書がインストールされている場合 (以前はこれが必須要件でした) に非常に有効です。Server Name Indication (SNI) を使用すると、Web サーバーは同じ IP アドレスに複数の SSL 証明書をインストールできます。SNI 対応のブラウザは、最初のハンドシェイク プロセス中にアクセスしようとしているサーバーのホスト名を指定します。これにより、Web サーバーは接続に使用する正しい SSL 証明書を決定できます。
再度、 を使用すると、openssl
このシナリオでブラウザが何を実行するかをシミュレートできます。
$ openssl s_client -connect someserver:443 -servername sslsite-example.com
抜粋
SSL ネゴシエーションは、HTTP リクエストをリモート サーバーに送信する前に実行する必要があります。つまり、ブラウザーとサーバーはプロセスの早い段階で証明書を交換する必要があり、ブラウザーはアクセスしようとしているサイトを指定する機会がありません。SNI は、SSL ネゴシエーション プロセス中に Host: ヘッダー タイプの交換を許可することで、この問題を解決します。