今までSSL証明書をなんとなく雰囲気で使っていた感が否めないため、自信を持って解説ができるよう具体的な仕組みを調べたメモ。
X.509証明書
X.509証明書はISO/IECによって定められている証明書に関する仕様。
公開鍵証明書、属性証明書、特定証明書の三つがあり、主に公開鍵証明書が一般に「証明書」と呼ばれる。
公開鍵証明書は、CA証明書とエンドエンティティ(またはリーフ)証明書に別れる。
CA証明書はルートCA証明書と、中間CA証明書に別れ、ブラウザやOSはルートCA証明書の一覧をあらかじめ持ち検証に使う。ルートCA証明書は中間CA証明書を発行することができ、その中間CAも新しい中間CA証明書を作成することができるため、チェーンする。
CA証明書かどうかは、拡張領域のbasicConstraints(基本制約)フィールドに設定されるフラグにより判断され、CAであれば上位のCAをたどり、ルートCAまで遡れれば検証が完了する。
例えば、以下はGoogleにopensslを用いてアクセスをした例:
depth=1 /C=US/O=Google Trust Services/CN=Google Internet Authority G3 verify return:0 --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3 1 s:/C=US/O=Google Trust Services/CN=Google Internet Authority G3 i:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
sがSubject(証明の対象)、iがIssuer(発行者)。 www.google.comに対する証明書から、Google Trust ServicesのCA、GlobalSignのルートCAと辿れていることがわかる。 (GlobalSignはGMOグループのルート認証局。GoogleがGMOに依存してるの意外。)
apacheだと中間証明書を指定するディレクティブがあるため意識しないが、nginxなどでは公開鍵に中間証明書を結合して設定する必要がある。 (PEMファイルの仕様 https://tools.ietf.org/html/rfc7468#page-5。サーバ証明書、中間CA証明書の順で結合する。https://tools.ietf.org/html/rfc4346#page-41)
証明書の失効
証明書に記載されている有効期間(notBefore, notAfter)以外の理由で失効する場合、証明書の失効はCRLまたは、OSCPというプロトコルによってクライアントに伝えられる。CRLは証明書に付与されるシリアルナンバーのリストをWeb上でホストする方式で、古いTLSクライアントで用いられている。このリストは肥大化するため、デルタCRLという差分のみを提供する方式がある。
OSCPは認証局に証明書の状態を問い合わせるプロトコル。クライアントが直接叩くか、OSCP staplingを用いてサーバが代わりに認証局へ問い合わせる方式がある。