Let's Encryptが落ちていてOCSPリクエストがエラーになる

Service status: Service Disruption

https://letsencrypt.status.io/

アクセスのあるサイトはキャッシュが生きているのだが、運悪く証明書を更新したばかりのサイトがあった。これは困る。

Firefoxsecurity.ssl.enable_ocsp_stapling = true (デフォルト) クライアント環境で SEC_ERROR_OCSP_TRY_SERVER_LATER が表示されたりする。Apache では SSLStaplingReturnResponderErrors on (デフォルト)か SSLStaplingFakeTryLater on (デフォルト)をoffにすれば回避できる。とりあえず SSLStaplingFakeTryLater が問題発見の邪魔になるので切る。
また SSLStaplingResponderTimeout 10 (デフォルト)を短くするとトラブル時にクライアントの初回アクセス時間を短縮できる。といってもクライアント側でも検証できない以上keep-aliveでTLS接続が生きている間だけのような雰囲気だし、短くしすぎると正常なレスポンスも受け取れなくなる懸念がある。

今回はOCSPサーバが動いていないことが分かってるので一時的に SSLUseStapling を切っても何ら問題はない。

診断

$ openssl s_client -connect DOMAIN:443 -status -servername DOMAIN < /dev/null | less
...
DONE
CONNECTED(00000003)
OCSP response: no response sent
...

OCSPが返らない。
OpenSSL: Manually verify a certificate against an OCSPを参考に細かくテストする。詳しくはman ocsp

$ openssl x509 -noout -ocsp_uri -in cert.pem
http://ocsp.int-x3.letsencrypt.org/

$ openssl ocsp -issuer chain.pem -cert cert.pem -text -url http://ocsp.int-x3.letsencrypt.org/ -header HOST ocsp.int-x3.letsencrypt.org -resp_text
...
Error querying OCSP responsder
140014513862560:error:27076072:OCSP routines:PARSE_HTTP_LINE1:server response error:ocsp_ht.c:250:Code=400,Reason=Bad Request

400になってしまった。Hostヘッダを手動で送る。

$ openssl ocsp -issuer chain.pem -cert cert.pem -text -url http://ocsp.int-x3.letsencrypt.org/ -header Host ocsp.int-x3.letsencrypt.org
...
Error querying OCSP responsder
140045098887072:error:27076072:OCSP routines:PARSE_HTTP_LINE1:server response error:ocsp_ht.c:250:Code=504,Reason=Gateway Time-out

しばらく待たされてからサーバ側でタイムアウトする。
Apache では SSLStaplingErrorCacheTimeout 600 (デフォルト)があるが、OCSPのレベルのエラーをキャッシュするだけなのか、このHTTPエラーはキャッシュしないようだ。