【CentOS Stream 9】OCSP絡みのエラーが出ていた

OCSP(Online Certificate Status Protocol)という仕組みがあります。
これを使えばSSLサーバー証明書などのデジタル証明書が現時点において有効なものであるかを速やかに確認することができます。

CentOS Stream 9をインストールしていろいろとテストを行っている環境において、OCSPに関わるエラーが発生していたので調査をしてみました。

こちらの記事もよろしければご覧ください。

関連記事

CentOS Stream 9の環境でWordPressを動かしてみます。 今までのOSで動かす場合と大きく変わるところはないので過去に構築した経験のある方なら簡単な作業だと思います。 WordPress WordPressは公式サイ[…]

ログに出力されていたエラーメッセージ

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のエラーで困っている方の参考になれば幸いです。