Linux openssl CN/ホスト名検証とSSL証明書

Linux openssl CN/ホスト名検証とSSL証明書

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: ヘッダー タイプの交換を許可することで、この問題を解決します。

参考文献

関連情報