コンテンツにスキップ

openssl verify

証明書チェーン を構築し、対象 証明書 が信頼できるか検証するコマンド。

証明書の署名、有効期間、CA制約、CAのKey Usageなどを検証する。 -purpose を指定すると、対象証明書の Key Usage や Extended Key Usage が用途に合っているかも確認できる。

失効 は自動では確認されない。CRLを使う場合は -CRLfile と -crl_check などを明示的に指定する。


Terminal window
openssl verify \
-CAfile 信頼するCA証明書 \
-untrusted 中間CA証明書 \
検証する証明書

証明書ファイル名を指定した後ろに書いた値は、オプションではなく別の証明書ファイルとして解釈される。オプションは対象証明書より前に指定する。


Terminal window
openssl verify \
-CAfile root.crt \
-untrusted intermediate.crt \
server.crt

役割:

root.crt 信頼する起点
intermediate.crt チェーン構築に使う中間証明書
server.crt 検証対象

期待する結果: server.crt: OK


Terminal window
openssl verify \
-CAfile root.crt \
-untrusted intermediate.crt \
-purpose sslserver \
-verify_hostname www.example.com \
server.crt

OpenSSLは SAN のDNS名、またはSubjectのCommon Nameと照合する。現代のTLSサーバー証明書では、接続に使用するDNS名をSANへ含める。

Terminal window
openssl verify \
-CAfile root.crt \
-untrusted intermediate.crt \
-purpose sslserver \
-verify_ip 192.168.1.1 \
server.crt

証明書のSANに IP:192.168.1.1 が含まれているか確認する。


信頼するCA証明書をまとめたファイルを指定する。

Terminal window
-CAfile root.crt

ここへ指定した証明書は Trust Anchor として扱われる。通常は自己署名の Root CA証明書 を指定する。

複数のCA証明書を含める場合は、 PEM形式 の証明書を連結したファイルを指定できる。

証明書チェーンの構築に使用する Intermediate CA証明書 を指定する。

Terminal window
-untrusted intermediate.crt

名前のとおり、このファイルに含まれる証明書自体を信頼するわけではない。信頼済みRoot CAまでチェーンをつなぐための候補として使用する。

対象証明書の用途を指定し、Key UsageやExtended Key Usageが用途に合っているか検証する。

Terminal window
-purpose sslserver

TLSサーバー証明書では sslserver、TLSクライアント証明書では sslclient を使用する。指定しなければ、 openssl verify 単体では特定用途に対する対象証明書の拡張検査を行わない。

証明書が指定したDNS名に対して有効か検証する。

Terminal window
-verify_hostname www.example.com

OpenSSLはSANのDNS名、またはSubjectのCommon Nameと照合する。現在のTLSサーバー証明書では、接続先名をSANへ指定する。

証明書が指定したIPアドレスに対して有効か検証する。

Terminal window
-verify_ip 192.168.1.1

IPアドレスはSANの IP として登録されている必要がある。 DNS へIPアドレスを記述したものとは一致しない。

検証に成功した場合、構築された証明書チェーンを表示する。

Terminal window
-show_chain

-untrusted から使用された証明書には untrusted と表示されるが、これは検証失敗を意味しない。

証明書チェーンの末尾にある自己署名証明書についても、自己署名を検証する。

Terminal window
-check_ss_sig

Root CA証明書自身の署名まで確認する場合に使用する。通常のチェーン検証では、Trust Anchorの自己署名は既定では検証されない。

自己署名の検証に成功しても、そのRoot CAが自動的に信頼されるわけではない。信頼するかどうかはTrust Storeの設定によって決まる。


例:

error 20 at 0 depth lookup: unable to get local issuer certificate

depth は問題が見つかった位置を示す。

depth 対象
0 検証対象のサーバー証明書
1 その発行元のIntermediate CA証明書
2 さらに上位のCA証明書

よくある原因:

  • Intermediate CA証明書を -untrusted へ指定していない
  • 誤ったRoot CA証明書を -CAfile へ指定している
  • 証明書の有効期限が切れている
  • CA証明書に CA:TRUE や keyCertSign がない
  • SANと検証するDNS名・IPアドレスが一致しない


  • openssl-verify 証明書チェーンの検証、信頼する証明書と中間証明書の指定。

  • openssl-verification-options ホスト名、IPアドレス、用途、有効期間などの検証オプション。