X.509 証明書は、発行者の署名を通じて、サブジェクトの公開鍵を主張されたサブジェクト アイデンティティに結び付けます。証明書の検証では、その結び付きを特定のプロトコルと 接続で受け入れられるかどうかを判断します。証明書を解析したり署名だけを検証したり するだけでは十分ではありません。
エンコーディングと証明書の構造 #
証明書は ASN.1 値であり、通常は DER でエンコードされます。PEM は DER オブジェクトの Base64 テキスト形式です。
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----署名対象の tbsCertificate には、バージョン、発行者固有のシリアル番号、発行者の識別名、
有効期間、サブジェクトの識別名、SubjectPublicKeyInfo (SPKI)、拡張が含まれます。外側の
証明書には、発行者の署名アルゴリズム識別子と tbsCertificate に対する署名も含まれます。
発行者の公開鍵は別の証明書フィールドとして埋め込まれていません。発行者証明書または
トラストアンカーへのパスを構築して見つけます。
TLS で使用される拡張 #
RFC 5280 の拡張は、証明書の使用方法を制約します。
basicConstraintsは CA 証明書とパス長の制限を識別します。keyUsageはkeyCertSignやdigitalSignatureなどの操作を制限します。extendedKeyUsageはサーバー認証またはクライアント認証に使用を制限できます。subjectAltNameは TLS アイデンティティチェック用の DNS 名と IP アドレスを保持します。- サブジェクトキー識別子と認証局キー識別子はパス構築を支援しますが、署名検証の代わりにはなりません。
TLS クライアントは、要求された DNS 名を subjectAltName に対して検証します。共通名は、
正しく発行された現代の証明書における一般的なフォールバックではありません。有効時刻、
クリティカル拡張、署名アルゴリズムポリシー、基本制約、キー使用法はすべて検証に関与します。
パス、失効、ピンニング #
パス構築は、リーフ証明書からローカルに構成されたトラストアンカーまでの発行者の
シーケンスを選択します。パス検証では、署名、時刻、basicConstraints、パス長および
名前の制約、キー使用法、クリティカル拡張、依拠当事者のアルゴリズムとポリシー要件を
検証します。アプリケーションが証明書ポリシーを使用する場合、ポリシーツリーで受け入れ
可能な証明書ポリシーを制限できます。サーバーはこの処理に必要な中間証明書を送信します
が、通常、トラストアンカーはクライアントのトラストストアから提供されます。
CRL と OCSP は失効情報を提供しますが、クライアントの動作はプラットフォームとプロトコル によって異なります。実際のクライアント集団でテストせずに、即時の失効適用を保証しては なりません。証明書ピンニングは公開鍵または証明書の制約を追加します。運用上の復旧コスト があるため、定義済みのローテーション手順がある場合にだけ使用してください。
フィールドを調べるには openssl x509 -in cert.pem -noout -text を使用します。表示される
SHA-256 フィンガープリントは、帯域外比較のための証明書バイト列のダイジェストです。
アイデンティティの証明でも、パス検証の代替でもありません。
証明書を認証する TLS 1.3 ハンドシェイクについては、TLS 1.3 を参照してください。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)