WebサーバーなどのSSL証明書 検証方法

多くのWebサイトがHTTPS化されることで発生するトラブルが「正しくSSL証明書が設定されていない」事によるWebサイトの表示ができないというトラブルです。SSL証明書をインストールしても正しい設定ではない場合、Webブラウザでエラーを表示したり通信に失敗する場合があります。

Webブラウザの鍵マーク検証で不足の理由

SSL証明書が正しく反映されたかを確認する方法として、Webブラウザの鍵マークから証明書の情報を表示して確認する方法があります。
この方法で検証した場合とopensslで検証した場合で何が違うでしょうか。

Webブラウザによっては、接続するSSL証明書に記載されている Authority Information Access 拡張フィールドから、必要な中間証明書を自動でインストールする機能を持つものもあります。
これにより有効期限が切れた中間証明書をインストールしていたり、中間証明書のインストールミスがあっても、Webブラウザでは表示されますのでトラブルに気がつきにくいという問題があります。

全てのWebブラウザが中間証明書の自動インストールに対応しているわけではなく、スマートフォンなどのブラウザではエラーになることがあります。
このため、Webブラウザの鍵マークでの検証ではなく、opensslでの検証をオススメします。

SSL証明書の検証方法: ファイルでの確認

公開前にSSL証明書のチェインが正しいかを確認するには以下のコマンドを実行します。

openssl verify -CAfile <(cat /etc/pki/tls/certs/ca-bundle.crt /path/to/chain_crt.crt) /path/to/server.crt
ca-bundle.crt
OS付属のroot証明書。もしくは、指定のroot証明書
chain_crt.crt
中間証明書
server.crt
公開するサーバーの証明書

コマンドを実行して「OK」が表示されれば証明書のチェインに問題ないことが確認できます。

SSL証明書の検証方法: 公開済みサーバー

Webサーバーやメールサーバーに設定した証明書が正しく機能しているか確認するためには、opensslコマンドを使用して次のように実行します。

$ openssl s_client -connect [FQDN]:443  -servername [FQDN] < /dev/null

[FQDN]には、www.infocircus.jpなどのドメイン名を指定します。

SSL証明書の検証例

www.infocircus.jp のSSL証明書を検証した結果は、次のようになります。

$ openssl s_client -connect www.infocircus.jp:443  -servername www.infocircus.jp < /dev/null
CONNECTED(00000005)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.infocircus.jp
verify return:1
---
Certificate chain
 0 s:/CN=www.infocircus.jp
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFWTCCBEGgAwIBAgISBGvLxl1Bc0JG9pcWajG7bny1MA0GCSqGSIb3DQEBCwUA
<略>
Iy0glLX/lkCu8SsyMQzH0uPqE34uVsZjPFya1UY=
-----END CERTIFICATE-----
subject=/CN=www.infocircus.jp
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3256 bytes and written 352 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 545A3A198667727E7EF01FB14C9B66F63673DDA5314EC3F88D8762E159F22C7E
    Session-ID-ctx: 
    Master-Key: 17AF08AEDDF7FD06CCD4E10D56DCB40CA609A191BDD9F9AF26DDB110B251FAB1DF57564410FC8CE2045A48846D99A0A1
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 05 86 9a dc 51 d6 95 a5-92 13 56 01 41 6a c4 91   ....Q.....V.Aj..
<略>
    00c0 - 8f be 25 ee a0 56 82 f6-0e 1f ba 17 a0 a8 52 b4   ..%..V........R.

    Start Time: 1571794004
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)

SSL証明書 検証結果の確認方法

検証で depth=X の表示になっている部分は、証明書のツリーを表しています。
depth=0がオリジナルの証明書、depth=1... とルート証明書までのツリーが確認できます。

depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = www.infocircus.jp
verify return:1

上記の例では、depth=0でCN=www.infocircus.jpとなり、depth=1(1つ上位)でCN = Let's Encrypt Authority X3、depth=2でルート証明書のCN = DST Root CA X3を示しています。

SSL証明書の検証が正常だったかは最後の行を確認します。

    Start Time: 1571794004
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)

Verify return code が 0(ok)となっていますので、SSL証明書が正しく検証されていることが確認できます。
この Verify return codeが、0(ok)でない場合、SSL証明書の設定に間違いがあるか、指定している証明書が不正の可能性があります。

SSL検証に失敗したときの例

実際にSSL証明書の検証に失敗するとどうなるのか、いくつか代表的な例をご紹介いたします。

証明書の有効期限が切れている

SSL証明書の有効期限が切れている場合には、Verify return codeで次のようなエラーとなります。

    Start Time: 1571797141
    Timeout   : 7200 (sec)
    Verify return code: 10 (certificate has expired)

中間証明書のチェインが不正な場合

    Start Time: 1571797456
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)

その他のエラーコード

Verify return code: 18 (self signed certificate)
自己証明書を使用している場合。もしくは証明書の指定を間違っている場合など
Verify return code: 20 (unable to get local issuer certificate)
ローカルの証明書にアクセスできないもしくは、複数のWebサーバーなどで証明書が異なっている場合など

メールサーバーのSSL証明書の検証

メールサーバーのSMTP(TLS接続)でSSL証明書の確認を行うには、次のコマンドを使用します。

openssl s_client -connect [FQDN]:587 -showcerts -starttls smtp < /dev/null

実際にメールサーバーの証明書を確認した結果が次の通りです。
サンプルのため、サーバー名は変更してあります。

$ openssl s_client -connect sample.infocircus.jp:587 -showcerts -starttls smtp < /dev/null
CONNECTED(00000005)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = sample.infocircus.jp
verify return:1
---
Certificate chain
 0 s:/CN=sample.infocircus.jp
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
-----BEGIN CERTIFICATE-----
MIIFWzCCBEOgAwIBAgISA2B8vRAS8+xhNEjObdYcW0OnMA0GCSqGSIb3DQEBCwUA
<略>
3cd2XyZSnso1qjeL19gu3E0s+tQVSY7maPSuFgOZMoYkks4BMWJL/EwyMKvGa7EZ
W/sIqys0YkFXfLXIs4pt6fMuPgr7zH8xZoadCPmEgw==
-----END CERTIFICATE-----
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/
<略>
PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6
KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
 2 s:/O=Digital Signature Trust Co./CN=DST Root CA X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
<略>
JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=sample.infocircus.jp
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Server Temp Key: DH, 1024 bits
---
SSL handshake has read 4438 bytes and written 425 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : DHE-RSA-AES256-GCM-SHA384
    Session-ID: 77E272970646863E77DC86815275CB063F20C7DEF6F04FA2C7CCEB3572A00964
    Session-ID-ctx: 
    Master-Key: 236051E9290EDA24585AC0FC047F55825FE5B63E73949F9DFBC45E9FB980C419F8491AFC065DF32A4DBE7ED3962499DD
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 71 fc 70 06 2b cb 2c 20-8d a1 7d 9a d7 37 bb 6a   q.p.+., ..}..7.j
<略>
    0090 - bb 77 9c 39 d0 60 f7 aa-54 b2 da ef 95 2e 7b 54   .w.9.`..T.....{T

    Start Time: 1571810245
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
250 DSN

imapサーバーの証明書の検証

同様にimapサーバーの証明書を検証するには以下のコマンドを実行します。

$ openssl s_client -connect [FQDN]:993 -showcerts < /dev/null

これで、Webサーバー(HTTPS)とメールサーバーのSSL証明書の検証ができました。


お問い合わせはこちらから