うまいぼうぶろぐ

linuxとhttpdとperlのメモ

opensslでOCSP Responder を起動する

# openssl ocsp -index index.txt -CA cacert.pem -rsigner cacert.pem -rkey \
  private/cakey.pem -port 2560
Enter pass phrase for private/cakey.pem: # cakey.pemのpassphrase を入力
Waiting for OCSP client connections...
Invalid request
Responder Error: malformedrequest (1)

ただ、この状態でportscanなどをすると、opensslが以下のメッセージを出力して落ちてしまう。

Invalid request
Responder Error: malformedrequest (1)

openssl ocsp help にはなかったけど、-ignore_err をつけたら大丈夫らしい。

# openssl ocsp -ignore_err -index index.txt -CA cacert.pem \
  -rsigner cacert.pem -rkey private/cakey.pem -port 8888

参考

ocspのdefault port は特に決まってない?
openssl ocspのhelpを見ると8888。他にはおそらくRFCの番号からきてる2560を使ってる例も見た。

Address already in use

openssl ocsp を終了したあとすぐ(1分以内?)に再度起動しようとすると
以下のエラーが出てしばらく起動できない。
もちろん他のdaemonなどで8888 portはlistenしていない。

Error seting up accept BIO
139904574490440:error:02006062:system library:bind:Address already in use:b_sock.c:804:port='8888'
139904574490440:error:20069075:BIO routines:BIO_get_accept_socket:unable to bind socket:b_sock.c:806:

どうも仕様みたいなので諦める:-)

index.txt の再読み込み

openssl ca -gencrl -revoke /path/to/newcert.pem
などとして特定の証明書を失効してindex.txtを更新しても
openssl ocspは起動時に読み込んだものを使うので反映はされない。
最近マイブームのinotify/incrond あたりを併用してindex.txtが更新したら自動で再起動する仕組みを作る、
もしくはopenssl ocspはループで起動するようにしていて、
index.txtを更新するアプリケーション側でocspプロセスをkillするとか。

OCSPの動作確認(ocsp verify)

クライアント証明書のファイルを-certで指定するか、
シリアルナンバーを-serialで指定する。(16進数ではなく10進数)

openssl ocsp -issuer /etc/pki/CA/cacert.pem -nonce -CAfile /etc/pki/CA/cacert.pem -url http://localhost:8888/ -cert /path/to/client_cert.pem 
openssl ocsp -issuer /etc/pki/CA/cacert.pem -nonce -CAfile /etc/pki/CA/cacert.pem -url http://localhost:8888/ -serial 11111111111111111111

証明書が有効な場合のレスポンス

Response verify OK
newcert.pem: good
        This Update: (現在日時)

証明書が失効している場合

Response verify OK
newcert.pem: revoked
        This Update: (現在日時)
        Revocation Time: (失効した日時)