ApacheでOCSP Staplingを有効にしてみた
Apache では設定を二行加えるだけで OCSP Stapling を有効にできた。
HTTPS によるアクセスでは、通信を暗号化するためにサイトの証明書が必要です。
この証明書には有効期間が有りますが、有効期間内であっても証明書が失効している可能性が有ります。そのため証明書が失効していないか確認する必要が有ります。
証明書が有効か確認するには、CRL と OCSP という二種類が有ります(注1)。この二種類の方法の内、現在はレスポンスのが速いという利点(注2)から主に OCSP が使用されています。
ただし OCSP にも次のような問題点が有ります(注3)。
- OCSP 応答が得られない場合にサーバ証明書の失効検証を正しく行わないまま SSL 通信を許可してしまう可能性がある。
- OCSP を使った場合には、あるサイトにアクセスがあったことを OCSP レスポンダも知り得てしまう。
そこでこの問題を回避するために、RFC6066 ではコンテンツを配信するサーバが OCSP レスポンダを兼ねる(キャッシュする)ことができる方法が提案されています(注4)。これにより OCSP レスポンダに関するどちらの問題点も解消できます。
なおこの RFC6066 の証明書状態リクエスト(TLS Certificate Status Request)は、OCSP stapling と一般に呼ばれています(注5)。
OCSP stapling を有効にする Apache の設定
OCSP stapling の説明が長くなりましたが、Apache で OCSP stapling を有効にする設定はいたって簡単です(注6)。
Ubuntu の apache パッケージで Apache をインストールしたならば、SSL のグローバル設定である/etc/apache2/mods-enabled/ssl.conf
に次の二行を追加します。
SSLUseStapling On
SSLStaplingCache shmcb:${APACHE_RUN_DIR}/ssl_stapling(32768)
設定はこれだけです。
設定を変更したら apache を再起動します。
$ sudo apachectl configtest
Syntax OK
$ sudo service apache2 restart
OCSP stapling が有効か確認
OCSP stapling が有効になっているかは、openssl
コマンドを使用して確認します。
OCSP stapling が有効になっている場合は、次のようにOCSP Response Data
を含む結果が得られます。
$ openssl s_client -connect www.example.jp:443 -status -servername www.example.jp < /dev/null | head
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X1
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000003)
OCSP response:
======================================
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Responder Id: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X1
Produced At: Dec 23 14:51:00 2015 GMT
Responses:
DONE
もし次のようにOCSP response: no response sent
となった場合は、OCSP stapling が有効になっていません。
$ openssl s_client -connect www.example.jp:443 -status -servername www.example.jp < /dev/null | head
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X1
verify error:num=20:unable to get local issuer certificate
verify return:0
DONE
CONNECTED(00000003)
OCSP response: no response sent
---
Certificate chain
0 s:/CN=www.nosuz.jp
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X1
i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate