新しいCA証明書がクライアントにプッシュされるにつれて、証明書チェーンをダウンロードしてローカルで確認しようとします。基本的に、どのウェブサイトが特定の時間に機能しているかを把握することです。次のコマンドを使用してチェーンをダウンロードします。
echo -n | openssl s_client -showcerts -connect example.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > mycert.pem
ただし、それを使用すると、openssl verify
次のエラーメッセージが表示されます。
root@host:~# openssl version
OpenSSL 1.1.0e 16 Feb 2017
root@host:~# echo -n | openssl s_client -showcerts -connect example.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > mycert.pem
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1
DONE
root@host:~# openssl verify mycert.pem
C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
error 20 at 0 depth lookup: unable to get local issuer certificate
error mycert.pem: verification failed
これらの証明書チェーンをオフラインで確認する正しい方法は何ですか?
答え1
確認したい証明書をあるファイルに入れ、チェーンを別のファイルに入れる必要があります。
openssl verify -CAfile chain.pem mycert.pem
もちろん、openssl
chain.pemにルート証明書が含まれていない場合は、ルート証明書を見つける方法を知ることも重要です。これを行う必要がある場合(独自のCAを使用している場合)、次の場所にある代替ディレクトリを指定することもできます。-CApath
答え2
そのため、OpenSSLはファイルの最初の証明書のみを確認するという答えを見つけました。これは、有効なチェーンがある場合にのみ最後の証明書を確認する必要があることを意味します。
答え3
certtool
との組み合わせで目的の結果を得ることができますopenssl
。これには2つのタスクが関係していることに注目する価値があります。 1つはチェーン自体を確認すること、もう1つはローカルにインストールされている信頼できるルート証明書によってチェーンが信頼されていることを確認することです。
警告:否定的なケースを確認してください。
否定的なケースがあることを確認してください。つまり、テストで無効と見なされるべきものが無効と正しく処理されていることを確認してください。あなたはこれを行うことができますhttps://badssl.com/または自分で作ったもの。何をテストしても否定的なケースが失敗するかどうかわからない場合、テストはあまり役に立ちません。
チェーンが信頼できることを確認してください。
openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null \
| sed -ne '/-BEGIN/,/-END/p' \
| certtool --verify
チェーンの一貫性のみを確認し、信頼は確認しません。
openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null \
| sed -ne '/-BEGIN/,/-END/p' \
| certtool --verify-chain
信頼できるチェーンの例:
$ openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' | certtool --verify
Loaded system trust (154 CAs available)
Subject: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Checked against: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Verified. The certificate is trusted.
Subject: CN=www.example.org,OU=Technology,O=Internet Corporation for Assigned Names and Numbers,L=Los Angeles,ST=California,C=US
Issuer: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Checked against: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Verified. The certificate is trusted.
Chain verification output: Verified. The certificate is trusted.
信頼できないチェーンの例:
$ openssl s_client -showcerts -connect untrusted-root.badssl.com:443 </dev/null 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' | certtool --verify
Loaded system trust (154 CAs available)
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Chain verification output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
信頼できないチェーンが有効であることを確認してください。
$ openssl s_client -showcerts -connect untrusted-root.badssl.com:443 </dev/null 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' | certtool --verify-chain
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Checked against: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Verified. The certificate is trusted.
Chain verification output: Verified. The certificate is trusted.
答え4
問題は-showcerts
コマンドの出力にあります。証明書とそれに署名した証明書のみがあり、中間証明書もありますが、チェーン全体はありません。 OKステートメントを取得するには、次の手順を実行する必要があります。
- 証明書(最初の
-BEGIN END-
ブロック)をファイルに入れます。mycert.crt
- 他のものはファイルに入れる
CAcerts.crt
openssh -text -in CAcerts.crt
これに署名したルートCAを見つけて確認してくださいCAfile.crt
。- CAがまだルート自己署名(CA)でない場合は、この操作を繰り返すことができます。
- その後、証明書を確認してください。
openssl verify -CAfile CAcerts.crt mycert.crt
注:環境設定GUI(証明書の表示とエクスポート)を使用して、Firefoxストアまたはcertutil
Firefoxプロファイルディレクトリを使用して、コマンドラインからよく知られているCA証明書を取得できます。たとえば、
$ find $HOME/.mozilla/firefox -name cert8.db # point for example to abcdef.default directory
$ certutil -a -L -d $HOME/.mozilla/firefox/abcdef.default/ -n "Let's Encrypt` Authority X3"