OpenSSLでOCSP Responderを構築する。

今回は、OCSPプロトコルの仕組みで利用するOCSP ResponderをOpenSSLで構築します。

OCSP Responderを構築する。

OCSP Responderは、OCSPの仕組みの中で証明書認証を実施する機器(OCSP Client)からくる、クライアント証明書の失効状態問い合わせに対し、証明書の失効状態を返却するサービスとなります。
OCSP Responderについて、起動時になぜかエラーがでるので引数「-ignore_err」をつけて起動します。
また、引数「-port」で利用するTCPポート番号を指定します。この値はデフォルト値がない(OCSPの規格としてもない)ので任意のポート番号を指定します。停止させる場合は「Ctrl+C」です。
このとき、CAの秘密鍵にパスワードを設定しているとパスワードの入力を求められますが、バッチに組み込みたいのでCAの秘密鍵にパスワードは設定していません。
※ 2020/05/23追記 OCSP ResponseにOCSPのキャッシュ有効期間となる Next Update が載っていなかったため、-nmin オプションを追加、5分有効とする設定を例に追加

openssl ocsp -ignore_err -index /etc/pki/CA/index.txt -CA /etc/pki/CA/cacert.pem -rsigner /etc/pki/CA/cacert.pem -rkey /etc/pki/CA/private/cakey.pem -port 8888 -nmin 5

OCSP Responderが起動したら、プロンプトが戻ってこないので別窓で以下のコマンドをたたいて動作確認します。

openssl ocsp -issuer /etc/pki/CA/cacert.pem -nonce -CAfile /etc/pki/CA/cacert.pem -url http://localhost:8888/ -cert /etc/pki/CA/newcerts/client1_cert.pem

失効していなければ以下のような応答があります。(証明書のCNはテスト用に変わっています。)

Response verify OK
/etc/pki/CA/newcerts/client2_cert.pem: good
        This Update: Mar  1 23:21:48 2020 GMT

失効していたら以下のような応答になります。Revocation Timeが追加されていますね。

Response verify OK
/etc/pki/CA/newcerts/client1_cert.pem: revoked
        This Update: Mar  1 23:15:13 2020 GMT
        Revocation Time: Feb 29 23:02:01 2020 GMT

また、OCSP Responder起動後に発行した証明書の応答は以下になります。
ステータスがunknownになっていますね。

Response verify OK
/etc/pki/CA/newcerts/client3_cert.pem: unknown
        This Update: Mar  1 23:26:33 2020 GMT

unknownを回避するにはOCSP Responderを再起動する必要があります。

OCSP Responderをサービス化する。

上記でOCSP Responderが構築できましたが、このままでは使いにくいのでサービス化します。
CentOS 8.1でサービスを登録するため、以下の内容のファイルを /etc/systemd/system/ に ocsp_responder.service という名前で配置します。

[Unit]
Description = OCSP Responder Deamon

[Service]
ExecStart =(スクリプトのパス)ocsp_res_start.sh
ExecStop = (スクリプトのパス)ocsp_res_stop.sh
ExecReload = (スクリプトのパス)ocsp_res_restart.sh

Type = simple

[Install]
WantedBy = multi-user.target

ちなみにサービス登録したところ、SELinuxで動作をブロックされましたが、本題ではないのでSELinuxをdisableに変更して回避しました。
スクリプトの各中身はこうです。
まずは ocsp_res_start.sh です。

#!/bin/bash

openssl ocsp -ignore_err -index /etc/pki/CA/index.txt -CA /etc/pki/CA/cacert.pem -rsigner /etc/pki/CA/cacert.pem -rkey /etc/pki/CA/private/cakey.pem -port 8888
exit 0;

次に ocsp_res_stop.sh の中身です。

#!/bin/bash
killall openssl
exit 0;

ocsp_res_restart.sh の中身は上記2件を順番に呼び出しています。

#!/bin/bash
(スクリプトのパス)ocsp_res_stop.sh
(スクリプトのパス)ocsp_res_start.sh
exit 0;

上記の登録ができたら、 systemctl start|stop|restart ocsp_responder.service で動作を確認してください。

OCSP Responderの設定は以上となります。
全部で4回とか、予想以上に長くなりましたが、クライアント証明書に関してはとりあえず以上となります。