X.509証明書
なりすましの対策とPKIのページで、電子証明書は「所有者の名前と公開鍵を結びつけ、認証局が署名したデータ」だと説明しました。本ページでは、電子証明書が実際にどのようなデータで構成されているのかを説明します。
本ページは、実装中に必要な情報を確認するための資料としても使えるようにまとめています。実装で直接扱うフィールドは一部なので、すべて覚える必要はありません。
証明書の構造
証明書の形式はITU-TのX.509で定められており、インターネット上で利用するためのフィールドや拡張の使い方はRFC 5280で規定されています。ここでは、RFC 5280 §4.1に沿って証明書の構造を説明します。
証明書のフィールドは表1のとおりです。1〜11がtbsCertificate、12と13が署名に関する部分です。なお、7と8はsubjectPublicKeyInfoという1つのフィールドにまとめられており、表にはその内部のフィールド名を記載しています。
| # | フィールド | ASN.1名 | 意味 |
|---|---|---|---|
| 1 | バージョン | version | X.509規格のバージョン。現在はv3(値は2) |
| 2 | シリアル番号 | serialNumber | CAが証明書ごとに割り当てる識別番号。同じCAが発行する証明書の間で一意となる |
| 3 | 署名アルゴリズム | signature | CAが署名に使用するアルゴリズム |
| 4 | 発行者 | issuer | 証明書を発行したCAの名前(DN) |
| 5 | 有効期間 | validity | notBeforeとnotAfterの組 |
| 6 | サブジェクト | subject | 証明書の所有者を表す名前(DN) |
| 7 | 公開鍵アルゴリズム | algorithm | 所有者の公開鍵のアルゴリズム |
| 8 | 公開鍵 | subjectPublicKey | 所有者の公開鍵のデータ本体 |
| 9 | 発行者識別子 | issuerUniqueID | CAの識別子(オプション。RFC 5280準拠のCAは生成禁止) |
| 10 | サブジェクト識別子 | subjectUniqueID | 所有者の識別子(同上) |
| 11 | エクステンション | extensions | 用途や代替名などの拡張情報(v3のみ・オプション) |
| 12 | 署名アルゴリズム | signatureAlgorithm | 署名に使用したアルゴリズム(3と同一) |
| 13 | 署名値 | signatureValue | DER符号化したtbsCertificate(1〜11)全体に対するCAのデジタル署名 |
X.509証明書のフィールド
9と10はRFC 5280で生成が禁止されているため、実際の証明書ではほとんど見かけません。
3と12には同じ署名アルゴリズムが記載されています。これは、RFC 5280が両者に同一のアルゴリズム識別子を指定するよう規定しているためです(§4.1.1.2・§4.1.2.3)。
外側の12は署名の対象に含まれませんが、内側の3はtbsCertificateの一部として署名されています。両者を比較することで、署名アルゴリズムの情報に食い違いがないことを確認できます。
v3拡張(extensions)
表1の11番にあたるエクステンションには、証明書の用途や検証に関わる重要な情報が入っています。TLSの証明書検証で使われる代表的な拡張を表2にまとめます。
| 拡張 | 意味 |
|---|---|
| Subject Alternative Name(SAN) | 証明書が有効なホスト名やIPアドレスなどの一覧。ホスト名の検証に使う |
| Basic Constraints | CA証明書かどうか(CA:TRUEならCA)。チェーン検証で使う |
| Key Usage | 鍵の用途(デジタル署名・証明書への署名など) |
| Extended Key Usage | 用途の限定(サーバー認証・クライアント認証など) |
TLSの検証で使われる代表的な拡張
かつてはサブジェクトのCN(Common Name)に記載されたホスト名を使っていましたが、現在はSANを使ってホスト名を検証します。
The Common Name RDN MUST NOT be used to identify a service because it is not strongly typed (it is essentially free-form text) and therefore suffers from ambiguities in interpretation.
訳)Common Name RDNは、強く型付けされておらず(実質的に自由記述のテキストである)解釈に曖昧さが生じるため、サービスの識別に使用してはならない。
RFC 9525(2023年)は、それまでのRFC 6125を置き換えたものです。RFC 6125ではSANがない場合の最後の手段としてCNの参照を認めていましたが、RFC 9525ではそれも認められなくなりました。発行側でも、CA/Browser ForumのBaseline RequirementsがsubjectAltNameを必須とし、CNは非推奨としています。Goのcrypto/x509もバージョン1.15から、標準ではCNへのフォールバックを行わなくなっています。
RFC 5280の§4.2.1では、15種類の標準拡張が規定されています。表2で紹介した4種類以外を表3にまとめます。
| 拡張 | 意味 |
|---|---|
| Authority Key Identifier | 発行者の鍵の識別子。チェーンを辿るときの手がかり |
| Subject Key Identifier | この証明書の鍵の識別子 |
| Certificate Policies | 証明書のポリシー。DV・OV・EVなどの種類もOIDで識別できる |
| CRL Distribution Points | 失効リストのURL |
| Issuer Alternative Name | 発行者の別名 |
| Subject Directory Attributes | 所有者の属性情報 |
| Name Constraints | CAが発行できる名前空間の制限 |
| Policy Constraints | ポリシー検証の制約 |
| Policy Mappings | CA間でポリシーを対応づける |
| Inhibit anyPolicy | anyPolicyの無効化 |
| Freshest CRL | 差分CRLの所在 |
RFC 5280が定義するその他の標準拡張
さらに、RFC 5280 §4.2.2で規定された拡張や、ほかのRFCで追加された拡張もあります。実際のWebサイトの証明書でよく見かけるものを表4にまとめます。
| 拡張 | 意味 |
|---|---|
| Authority Information Access(AIA) | 発行者証明書やOCSPレスポンダのURL(RFC 5280 §4.2.2.1) |
| Signed Certificate Timestamp(SCT) | Certificate Transparencyのログが証明書の登録を受け付けたことを示す情報(RFC 6962) |
Webサイトの証明書でよく見かける拡張
証明書の種類
サーバー証明書は、発行時に認証局が何を確認するかによって分類されます。代表的なものはDV、OV、EVの3種類ですが、CA/Browser ForumのBaseline Requirementsでは、個人の本人確認を行うIVも定義されています。
| 種類 | 審査プロセス | 主な利用先 |
|---|---|---|
| DV(Domain Validation) | ドメインの管理権限を確認する。DNSレコードやファイルの設置などによって確認でき、組織の実在性は審査しない。自動発行にも向いている | 個人サイトから大規模サイトまで、幅広いWebサイト |
| IV(Individual Validation) | ドメインの管理権限に加えて、個人の本人確認を行う | 個人の身元情報を証明書に記載したいサイト |
| OV(Organization Validation) | ドメインの管理権限に加えて、公的な記録などを使って組織の実在性を確認する。証明書に組織名が入る | 組織の身元情報を証明書に記載したい企業や学校などのサイト |
| EV(Extended Validation) | OVよりも詳細な基準に基づき、組織の法的な実在性や申請者の権限などを確認する | 組織の身元情報をより厳格な審査によって証明したいサイト |
サーバー証明書の種類
どの種類でも、TLSとしての暗号強度が変わるわけではありません。同じ署名アルゴリズムや鍵長を利用でき、違いは主に発行時に認証局が何を確認したかという点です。また、ドメイン名に対する保証の水準はどの種類でも同じです。
このように、公開認証局がサーバー証明書を発行する際には、所定の確認手続きが必要です。もっとも基本的なDVでも、ドメインの管理権限を確認できなければ証明書は発行されません。そのため、無関係な第三者が他人のドメインの証明書を取得することは容易ではありません。こうした審査が、証明書に記載された名前と公開鍵の対応を信頼できる根拠になっています。
実際の証明書
opensslを使うと、実際の証明書の内容を確認できます。
$ echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
06:24:d0:ab:31:15:58:78:0b:7d:52:13:b9:63:18:31
Signature Algorithm: ecdsa-with-SHA256
Issuer: C=US, O=SSL Corporation, CN=Cloudflare TLS Issuing ECC CA 3
Validity
Not Before: Jul 29 22:10:08 2026 GMT
Not After : Oct 27 22:17:21 2026 GMT
Subject: CN=example.com
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
...
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Authority Key Identifier:
83:03:FD:E7:F6:F5:4A:4D:15:41:F4:ED:22:16:D3:32:0A:3E:CA:66
Authority Information Access:
CA Issuers - URI:http://i.cf-i.ssl.com/Cloudflare-TLS-I-E3.cer
OCSP - URI:http://o.cf-i.ssl.com
X509v3 Subject Alternative Name:
DNS:example.com, DNS:*.example.com
X509v3 Certificate Policies:
Policy: 2.23.140.1.2.1
...
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Key Usage: critical
Digital Signature
CT Precertificate SCTs:
...
Signature Algorithm: ecdsa-with-SHA256
Signature Value:
...出力が長いため、公開鍵や署名の16進数の値は...に置き換えています。
Dataの部分が、表1の1〜11にあたるtbsCertificateです。Issuerには証明書を発行した中間認証局の名前が、SubjectにはCN=example.comが入っています。
X509v3 extensionsの部分が、表1の11にあたるv3拡張です。表2で紹介したSubject Alternative Nameには、example.comと*.example.comが記載されています。SubjectにもCN=example.comがありますが、ホスト名の検証には使いません。また、表4で紹介したAIAとSCTも含まれています。
次のページでは、証明書チェーンを使って、この証明書が信頼できるものかを検証する仕組みを説明します。