CRL と OCSP は、証明書が有効期限より前に失効したことをリライングパーティが知るための 2 つの仕組みです。証明書失効リスト(RFC 5280 §5)は、失効したシリアル番号を並べた署名付きのリストで、クライアントがこれをダウンロードします。Online Certificate Status Protocol(RFC 6960)は、1 つの証明書についての問い合わせに応答します。公開 Web PKI では、2024年以降、どちらを使うかの答えが決定的に変わりました。CRL は必須に、OCSP は任意になり、最大の CA は OCSP を停止しました。
比較表
| CRL | OCSP | |
|---|---|---|
| 仕様 | RFC 5280 §5 | RFC 6960(nonce:RFC 8954) |
| クライアントが受け取るもの | 対象範囲内で失効したすべてのシリアル番号の署名付きリスト | 1 つのシリアル番号に対する署名付きステータス(有効(good)、失効(revoked)、不明(unknown)) |
| サイズ(2026年10月20日に計測) | 1,591 エントリを含む 62,116 バイトの Let's Encrypt CRL シャード | 471 バイトの DigiCert OCSP レスポンス |
| 鮮度 | thisUpdate から nextUpdate まで(このシャードでは 9 日) | レスポンスの有効期間(このレスポンスでは 7 日) |
| プライバシー | サーバーにわかるのは CRL が取得されたことだけ | クライアントがどのサイトを訪問しているかがレスポンダーにわかる |
| 可用性への依存 | キャッシュ、ミラー、事前読み込みが可能 | ステープリングされない限りレスポンダーにリアルタイムで依存 |
| Web PKI のルール(Baseline Requirements) | 2024年3月15日から必須。新しい CRL を少なくとも 4 日ごと(すべての証明書に OCSP URL がある場合は 7 日ごと)、かつ失効から 24 時間以内に発行 | 2024年3月15日から任意 |
| ブラウザーでの利用 | 集約して利用:Firefox の CRLite、Chrome の CRLSets | Firefox は DV 証明書への問い合わせを停止(バージョン 142)。Chrome は大半の証明書で問い合わせない |
| サーバーからの配信 | 該当なし | OCSP ステープリング(status_request、RFC 6066) |
それぞれの仕組み
CRL には、発行者、thisUpdate と nextUpdate、単調に増加する CRL 番号、失効した証明書ごとに 1 つのエントリ(シリアル番号、失効日、任意で失効理由)が記載され、CA が署名します。証明書は、CRL 配布ポイント(CRL Distribution Points)拡張で自身の CRL を指します。大規模な CA は各ファイルが扱いやすいサイズに収まるよう CRL をシャードに分割し、パブリック CA は CRL URL の全一覧を CCADB で開示して、集約サービスがすべての失効を収集できるようにしています。CRL を確認するクライアントは CRL をダウンロードしてキャッシュします。リストが大きい場合は、デルタ CRL(RFC 5280 §5.2.4)で通信量を減らせます。
OCSP クライアントは、発行者名のハッシュ、発行者の鍵のハッシュ、シリアル番号を、証明書の機関情報アクセス(Authority Information Access)拡張に記載された URL に送信します。レスポンダーは、独自の有効期間を持つ署名付きのステータスを返します。レスポンスは nextUpdate までキャッシュでき、サーバーは新しいレスポンスを TLS ハンドシェイクに添付(ステープル)できるため、クライアントが CA に問い合わせる必要はありません。
上記の値は実際に計測したものです。2026年9月に発行された Let's Encrypt の証明書は http://ye2.c.lencr.org/96.crl だけを指し(OCSP URL はなし)、そのシャードは 62 KB でした。DigiCert の証明書には今も http://ocsp.digicert.com が記載されており、そのレスポンスは 471 バイトでした。
Web で OCSP が廃れた理由
ブラウザーにとってのリアルタイムの OCSP は、3 つの性質によって行き詰まりました。プライバシー:問い合わせのたびに、ユーザーがどの IP アドレスからどのサイトを訪問しているかが CA に伝わります。可用性:レスポンダーが遅いか到達できないと、ページの読み込みが止まるか、ブラウザーがソフトフェイルを選んだためにそのレスポンダーが黙って無視されるかのどちらかです。つまり、レスポンダーへの通信を遮断できる攻撃者は、この確認を無効にできます。コスト:レスポンダーは、インターネット上のすべてのページ読み込みに対応しなければなりません。ステープリングはプライバシーとコストの問題を解決しましたが、すべてのサーバーが確実にレスポンスを更新することが前提でした。ステープリングを強制できるはずだった Must-Staple(RFC 7633)に対応したのは、Firefox だけでした。
CA/Browser Forum はこれに対し、Ballot SC-063(2024年3月15日発効)で CRL を必須、OCSP を任意としました。Let's Encrypt は 2025年5月7日に新しい証明書から OCSP URL を削除して Must-Staple の注文の受け付けを停止し、2025年8月6日にレスポンダーを停止しました。Firefox はバージョン 137 で、すべてのデスクトップユーザーに対して CRLite を有効にしました。これは CT ログに記録された証明書のすべての失効をコンパクトにエンコードしたローカルデータで、12 時間ごとに更新され、ダウンロード量は 1 日平均で約 300 kB です。その後 Firefox 142 は、ドメイン認証(DV)証明書に対する OCSP 問い合わせを停止しました。Chrome は、サイトごとの問い合わせではなく、影響の大きい失効に絞って厳選されたセットである CRLSets を利用しています。
第 3 の選択肢:短期証明書
有効期間が数日しかない証明書には、失効の確認が要りません。失効が行き渡る頃には、すでに期限切れになっているからです。Baseline Requirements では、CA は短期証明書(2026年3月15日以降に発行されたものは最長 7 日)から失効情報を省略できます。また Let's Encrypt は 2026年1月から、ACME プロファイル shortlived で有効期間 160 時間の証明書を提供しています。2029年までに有効期間を全面的に 47 日へ短縮する流れ(Ballot SC-081v3)と合わせて、失効は主要な管理手段ではなく、最後の安全網になりつつあります。証明書の有効期間計算ツールで、発行日ごとの上限を確認できます。
どちらを選ぶべきか
- 公開 TLS サーバー:特別な対応は不要です。CRL を公開している CA から証明書を取得していることを確認し、Must-Staple は有効にしないでください。OCSP URL が存在しないと失敗するステープリングの設定は削除してください。
- 公開証明書を検証するクライアントソフトウェア:プラットフォームの検証機能を使います。利用可能な場合は、ブラウザーベンダーの失効セットが適用されます。
- クライアントが多く、一部がオフラインのプライベート PKI:
nextUpdateを短く設定した CRL を、可用性の高い HTTP で配信します。 - 価値の高い証明書とオンラインのクライアントを扱うプライベート PKI:OCSP を使います。プロトコルが対応していればステープリングを併用し、レスポンダーを自分で管理しているならハードフェイルのポリシーを適用します。
- ワークロードとサービスの ID:自動発行される短期証明書(数時間〜数日)を使います。失効のためのインフラは一切不要です。
- コード署名と文書署名:長期間有効な署名では、失効は今も重要です。CRL または OCSP をタイムスタンプと組み合わせ、検証者が署名時点のステータスを確認できるようにします。
移行時の注意点
- OCSP への依存関係を洗い出す:対象は、サーバーのステープリング設定、OCSP がないとハードフェイルするクライアント、レスポンダーを確認する監視です。
- ステープリングを任意にする:証明書に OCSP URL がないときに、nginx や Apache が起動を拒否してはいけません。
- プライベート CA では、まず CRL を公開する:新しい証明書に CRL 配布ポイントを追加し、大きなリストはシャードに分割し、
nextUpdateを失効の SLA に合わせて設定し、HTTP で配信します(循環的な依存関係を避けるため、HTTPS は使いません)。 - 自動化できる範囲で有効期間を短縮します。短縮を進めるたびに、失効が担わなければならない役割は小さくなります。
- エンドツーエンドで失効をテストする:テスト用の証明書を失効させ、想定した時間内にクライアントがそれを拒否することを確認します。CRL デコーダーと OCSP デコーダーで、クライアントから見える内容を確認できます。