SSL証明書のドメインチェックを行う

SSL証明書のドメインチェックを行う

ウェブサイトがそのドメインに有効な非自己署名証明書を使用しているかどうかをテストするスクリプトを作成しようとしています。つまり、ブラウザに警告は表示されません。

私は試してみました

openssl s_client -connect www.example.com:443 -servername www.example.com

証明書がドメインに対して有効でないにもかかわらず、次のようなメッセージが表示されます:

戻りコードを確認してください: 0 (OK)

どうすればそれを達成できるのか、何かアイデアはありますか?

答え1

openssl で実際に証明書を検証したい場合は、そのように指示する必要があります。

1. 証明書のホスト名が希望する名前と一致しているかどうかを確認する

これには特定のオプションがあります-verify_hostname。以下のコマンドでは、serverfault.com でこれを使用していますが、ホスト名 example.com に対してチェックしています。

[jenny@temeraire crt] $ openssl s_client -verify_hostname example.com  -connect serverfault.com:443
CONNECTED(00000003)
[...]
    Verify return code: 62 (Hostname mismatch)
---
DONE

ただし、プロセス自体の戻りコードは依然として 0 であるため、テストで戻りコードを使用するのではなく、出力を確認する必要があります。

2. 証明書が信頼できるCAからのものであるかどうかを確認する

私は、検証が失敗することが保証されるように、再度確認する信頼できる CA のリストを指定せずに、serverfault.com Web サイトに対してこれを実行しました。

[jenny@galactica tmp] $ openssl s_client -verify 2 -connect serverfault.com:443
[...]
    Verify return code: 27 (certificate not trusted)

ただし、コマンドは実際には適切に実行されているため、openssl は依然として戻りコード 0 を返すため、スクリプトで回避することが難しくなります。

より良い方法は、まず証明書をダウンロードしてからopenssl verifyそれを実行することです。

[jenny@galactica tmp] $ openssl verify selfsignedcert.pem; echo $?
selfsignedcert.pem: C=SE, O="Nevermind", CN=foo.example.com
error 18 at 0 depth lookup: self signed certificate
18

ご覧のとおり、戻りコード 18 が表示されました。これは「自己署名証明書」を意味します。他にもエラー コードがいくつかあります。verify詳細については、man ページを確認してください。

関連情報