OCSP レスポンス・リクエストデコーダー
DER ファイル、base64、PEM、パケットキャプチャの 16 進文字列のいずれからでも RFC 6960 のメッセージを読み、クライアントが見るとおりに展開します。レスポンスならまず OCSPResponseStatus です。データを含むのは successful だけなので、6 バイトの tryLater もそれ自体で完結した正当なレスポンスであり、どの証明書についても何も述べていません。これを壊れたファイルと勘違いするのはよくある誤報です。続いてレスポンダー ID とその形式(名前か、レスポンダー鍵の SHA-1 ハッシュか)、producedAt、そして単一レスポンスごとに CertID、good・revoked・unknown のステータス、thisUpdate、nextUpdate、失効していれば失効時刻と CRLReason を並べます。ノンス、アーカイブカットオフ、CRL 参照、extended-revoke といった読む価値のある拡張は OID の羅列ではなく値として展開します。extended-revoke を設定したレスポンダーは発行したことのない証明書にも revoked を返すため、unknown の意味そのものが変わります。この種のツールを実際に開く動機となる問いにも答えます。まだ鮮度があるか — thisUpdate と nextUpdate を画面に示した基準時刻と比べ、nextUpdate がなければ「更新されるまで有効」とはっきり述べます。ノンスは返ってきたか — 送ったリクエストを貼り付ければ両者を比較します。ステープリングのデバッグで最も多い驚きがノンスの消失です。署名したのは CA 自身か委任レスポンダーか — 同梱された各証明書の公開鍵をハッシュして CertID の issuerKeyHash と突き合わせ、委任レスポンダーなのに id-kp-OCSPSigning がなければ警告します。限界も明示します。CertID は発行者名と鍵のハッシュにシリアル番号を加えたもので、サブジェクト名に戻すことはできません。署名検証には発行者の公開鍵が必要ですが、このページはそれを持たず取得もしません。つまりここに見えるのはバイト列の忠実な読み取りであって、信頼の判断ではありません。
使い方
- .der ファイルをドロップするか、レスポンスを base64・PEM・16 進ダンプで貼り付けてください。解析はすべてページ内で行われます。
- まずレスポンスステータスを見ます。successful 以外は署名も証明書ステータスも含まない、それ自体で完結したレスポンスです。
- 証明書ステータスの表で good・revoked・unknown と thisUpdate・nextUpdate を、失効していれば失効時刻と理由もあわせて読みます。
- 鮮度の行と、その横の基準時刻を確認します。nextUpdate を過ぎたレスポンスは、仕様に従うクライアントなら拒否します。
- 最後の欄に送ったリクエストを貼ってノンスが返ってきたかを確かめ、証明書の欄で委任レスポンダーが id-kp-OCSPSigning を持つかを見ます。
よくある質問
- レスポンスが 6 バイトしかありません。切れているのでしょうか。
- まず違います。OCSPResponse は最初のフィールドがステータスの SEQUENCE で、続くレスポンス本体はステータスが successful のときにだけ存在します。したがって malformedRequest、internalError、tryLater、sigRequired、unauthorized は 5〜6 バイトで完結したレスポンスであり、署名も producedAt もなく、どの証明書にも言及しません。とくに tryLater は負荷のかかったレスポンダーが返す値で、クライアントは失敗扱いにせず再試行すべきものです。ステープリング用にレスポンスを保存しているなら、これを保存していること自体が不具合です。
- CertID がいまだに SHA-1 なのはなぜですか。弱点ではないのですか。
- 認証ではなく識別に使われているからです。CertID は発行者名のハッシュ、発行者公開鍵のハッシュ、証明書のシリアル番号からなる索引キーにすぎず、返ってきた答えを守るのはレスポンス全体への署名であってこのハッシュではありません。衝突攻撃を成立させるには、名前のハッシュも鍵のハッシュもシリアルも一致する別の発行者が必要で、それで得られるものは攻撃者にとってほとんど価値がありません。だから RFC 6960 はこの場所に SHA-1 を残しています。一方、レスポンス自体が SHA-1 で署名されているなら、それは本当の問題であり、このデコーダーは別途警告します。
- nextUpdate がありません。いつ期限切れになりますか。
- 形式上は期限切れになりません。RFC 6960 は、nextUpdate がない場合は常により新しい情報が利用可能であり、更新されるまで依拠してよいと述べています。実際にはクライアントが独自の上限を設けますが、解析できる限り受け入れ続ける実装も少なくありません。再送攻撃が狙うのはまさにこの窓です。ノンスが重要になる理由も同じで、ノンスがあれば捕まえたレスポンスを後の問い合わせに使い回せません。
- レスポンダーがノンスを落としました。無効なレスポンスですか。
- いいえ。これはデバッグ時に最もよく出会う驚きです。大手の公開 CA はレスポンスをまとめて事前生成し CDN から配るため、リクエストごとに異なるノンスを返す方式と相容れず、単に省きます。RFC 8954 もレスポンダーがこの拡張を無視することを認めています。レスポンス自体は有効で、失われるのは「自分の問い合わせのために作られた」という裏づけだけであり、鮮度は thisUpdate と nextUpdate に委ねられます。リクエストを貼り付ければ、返ってきたか、落とされたか、別の値で返ってきたかを教えます。最後の場合こそ、他人の問い合わせへの答えを見ているということです。
- unknown と、何も述べていないレスポンスはどう違いますか。
- unknown は明確な答えです。このレスポンダーにそのシリアルの記録がないという意味で、たいていは CertID が指す CA とは別の CA が発行したか、そもそも存在しない証明書です。good と同じではなく、同じに扱ってもいけません。その証明書については一切答えないという unauthorized とも違います。extended-revoke 拡張を持つレスポンダーなら意味はさらに狭まります。発行したことのない証明書にも 1970 年初頭を失効時刻とする revoked を返すため、そのレスポンダーの unknown は「自分の担当範囲外」に近くなります。
- どの証明書についてのレスポンスかを教えたり、署名を検証したりできますか。
- 前者はできず、後者は意図的に行いません。CertID はハッシュとシリアルの組で、ハッシュは逆にたどれないため、レスポンスと証明書を突き合わせるにはその証明書の発行者名と鍵をハッシュして比べるしかなく、証明書が手元にある必要があります。署名検証には発行者の公開鍵が必要ですが、このページは持たず取得もしません。ただしバイト列だけでも署名者は絞れます。同梱された証明書の鍵ハッシュを CertID の issuerKeyHash と比べれば、発行 CA か委任レスポンダーかが分かります。
関連ツール
HTTP ステータスコード リファレンス
1xx-5xx の全 HTTP ステータスコードを検索 — 概要・RFC・使い時・よくある落とし穴付き。
CRL デコーダー (X.509)
証明書失効リストをブラウザーで読み取ります。発行者、CRL 番号、有効期間、失効したシリアルと理由、署名の検証まで。
CSR デコーダー (PKCS#10)
証明書署名要求を送る前に確認します。サブジェクト、SAN、鍵長、署名アルゴリズム、そして自己署名が検証できるかまで。
ASN.1 / DER デコーダ
PEM でも base64 でも hex でも貼り付ければ ASN.1 のツリーを表示します。オフセット、タグ、長さ、復号した値まで。
CAA レコードビルダー (DNS 認証局権限制限)
CAA (Certificate Authority Authorization) DNS レコードを生成 — 信頼する CA だけがドメインの TLS 証明書を発行できるよう制限。
PKCS#12 キーストア インスペクター
.p12 / .pfx をブラウザーで開きます。パスワード前に MAC と暗号方式、入力後は証明書チェーン・秘密鍵・鍵の一致を確認できます。