OCSP(Online Certificate Status Protocol)という仕組みがあります。
これを使えばSSLサーバー証明書などのデジタル証明書が現時点において有効なものであるかを速やかに確認することができます。
CentOS Stream 9をインストールしていろいろとテストを行っている環境において、OCSPに関わるエラーが発生していたので調査をしてみました。
こちらの記事もよろしければご覧ください。
ログに出力されていたエラーメッセージ
Nginxのエラーログに下記が出力されていました。(一部伏せ字にしてあります)
OCSP_basic_verify() failed (SSL: error:03000098:digital envelope routines::invalid digest error:06880006:asn1 encoding routines::EVP lib error:13800075:OCSP routines::signature failure) while requesting certificate status, responder: xxx.xxx.com, peer: xxx.xx.xxx.x:80, certificate: "/etc/pki/tls/certs/fullchain.crt"
ハッシュ値が異なっているため署名が確認できない、的なエラーでしょうか。
しかし、CentOS Stream 8の環境においては当該エラーは出ていませんので一連の証明書には何の問題もないと思われます。
opensslコマンドによる確認
opensslコマンドでもOCSPは使えるので確認してみます。
尚、OpenSSLのバージョンはこちらになります。
OpenSSL 3.0.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
実行するコマンドはこちらになります。
openssl ocsp -no_nonce -issuer {中間証明書} -cert {SSLサーバー証明書} -url {OCSPサーバー} -text
上記コマンドの実行結果は下記の通りでした。(一部加工してあります)
Response Verify Failure xxxxxxxxxxxxxxxx:error:03000098:digital envelope routines:do_sigver_init:invalid digest:crypto/evp/m_sigver.c:333: xxxxxxxxxxxxxxxx:error:06880006:asn1 encoding routines:ASN1_item_verify_ctx:EVP lib:crypto/asn1/a_verify.c:201: xxxxxxxxxxxxxxxx:error:13800075:OCSP routines:ocsp_verify:signature failure:crypto/ocsp/ocsp_vfy.c:91: xxxxxxxxxxxxxxxx:error:03000098:digital envelope routines:do_sigver_init:invalid digest:crypto/evp/m_sigver.c:333: xxxxxxxxxxxxxxxx:error:06880006:asn1 encoding routines:ASN1_item_verify_ctx:EVP lib:crypto/asn1/a_verify.c:201: xxxxxxxxxxxxxxxx:error:13800075:OCSP routines:ocsp_verify:signature failure:crypto/ocsp/ocsp_vfy.c:91:
内容的にはNginxのエラーログに出ていたものと同じだと思います。
尚、OCSPサーバーのURLが分からない場合は下記のコマンドにて確認できます。
openssl x509 -in {SSLサーバー証明書} -text -noout | grep -i ocsp
エラーになっていた原因
opensslコマンドのエラーメッセージを参考にいろいろと調査した結果、エラーとなっていた原因が分かりました。
CentOS Stream 9に標準でインストールされるOpenSSLはハッシュアルゴリズムとしてSHA-1を使わないようです。
しかし、OCSPのレスポンスにSHA-1でハッシュ化されたものが含まれていて、それがうまく処理できなくてエラーになっていたみたいです。
(このあたり知識不足なもので、憶測が含まれています)
対策
対策としてはOpenSSLがSHA-1を使うようにすればいいだけです。
具体的にはopenssl.cnfに以下を追記します。
[openssl_init] #この行は既に存在していると思います : : alg_section = algs [algs] rh-allow-sha1-signatures = yes
(「algs」というセクションが既にある場合は別の名前にしてください)
尚、openssl.cnfの場所が分からない場合はこちらのコマンドで確認できます。
openssl version -d
修正後に再度上記のコマンドを実行したところ、正常に処理されるようになりました。
Response verify OK
また、Nginxのエラーログにもエラーは出力されなくなりました。
まとめ
今回は上記の手順にてひとまずエラーを回避することができました。
ただ、これが正攻法なのかは正直分かりません。
他の箇所に何らかの影響が出ている可能性もありますし、今後OpenSSLのバージョンアップで挙動が変わる可能性も否定できません。
試される場合は自己責任でお願いします。
この記事がOCSPのエラーで困っている方の参考になれば幸いです。
コメント