CA(Certificate Authority)证书是由 证书颁发机构(CA)本身签名的。具体来说,这取决于 CA 的类型和其在信任链中的位置:
1. 自签名证书
- 根 CA 证书 是信任链的起点,由 CA 自己签名。
- 它们是信任链的基础,浏览器或操作系统通过内置的信任列表信任这些根证书。
- 根证书签名过程:
- 使用 CA 的私钥对其证书的内容进行签名。
- 验证时,使用该 CA 的公钥即可验证签名。
2. 中间 CA 证书
- 中间 CA 证书 是由上一级 CA 签名的。
- 中间 CA 的签名过程:
- 上一级 CA 使用其私钥对中间 CA 的证书进行签名。
- 这样,中间 CA 证书与根证书构成信任链。
- 中间 CA 证书减少了根证书私钥的使用频率,从而提高了安全性。
3. 最终用户证书
- 最终用户证书(例如网站的 SSL/TLS 证书)是由中间 CA 签名的。
- 它们位于信任链的末端,为具体的实体(如网站或组织)提供身份验证。
- 最终用户证书的签名过程:
- 中间 CA 使用其私钥对用户证书签名。
- 通过中间 CA 证书和根 CA 证书,验证信任链完整性。
信任链示例
以下是一个典型的信任链:
- 根 CA 自签名 →
- 中间 CA 由根 CA 签名 →
- 最终用户证书 由中间 CA 签名。
总结
- 根 CA 证书 是自签名的,由 CA 自己签名。
- 中间 CA 和最终用户证书 是由上一级 CA 签名的。
- 浏览器或操作系统信任的根 CA 证书构成信任链的基础,通过逐级验证签名,最终信任用户证书。
以下是一个典型的 X.509 证书的例子,以及对其中字段的详细解析:
证书例子(PEM 格式)
-----BEGIN CERTIFICATE-----
MIIDdzCCAl+gAwIBAgIEUjGH3zANBgkqhkiG9w0BAQsFADB1MQswCQYDVQQGEwJV
UzELMAkGA1UECBMCTkMxEzARBgNVBAcTClNvbWV3aGVyZTEXMBUGA1UEChMOSGVs
bG8gQ29ycC4xEjAQBgNVBAMTCXNvbWVjZXJ0MB4XDTIzMDEwMTAwMDAwMFoXDTMz
MDEwMTAwMDAwMFowdTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAk5DMRMwEQYDVQQH
EwpTb21ld2hlcmUxFzAVBgNVBAoTDkhlbGxvIENvcnAuMRIwEAYDVQQDEwlsb2Nh
bGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDWmIz+1q1HxkbD
...
-----END CERTIFICATE-----
字段解析
X.509 证书包含多个字段,这些字段可以通过解析工具或代码提取查看。
1. 版本(Version)
Version: 3
- 标记证书使用的 X.509 版本号。
- 当前标准为版本 3。
2. 序列号(Serial Number)
Serial Number: 159753
- 唯一标识证书的整数值。
- 由颁发机构分配,用于区分其签发的每张证书。
3. 签名算法(Signature Algorithm)
Signature Algorithm: sha256WithRSAEncryption
- 描述用于对证书签名的算法(如 SHA-256 + RSA)。
4. 发行者(Issuer)
Issuer: C=US, ST=NC, O=Hello Corp., CN=somecert
- 颁发证书的 CA 信息:
C
: 国家(Country)ST
: 州或省(State/Province)O
: 组织(Organization)CN
: 公共名称(Common Name)
5. 有效期(Validity)
Not Before: Jan 1 00:00:00 2023 GMT
Not After : Jan 1 00:00:00 2033 GMT
- 指定证书的生效时间和过期时间。
6. 主题(Subject)
Subject: C=US, ST=NC, O=Hello Corp., CN=localhost
- 持有证书实体的信息(例如网站、用户或设备):
- 与
Issuer
字段的格式类似。
- 与
7. 主公钥(Subject Public Key Info)
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b7:31:e5:91:21:3d:...
Exponent: 65537 (0x10001)
- 包含证书持有者的公钥信息:
- 公钥算法:如 RSA、ECDSA。
- 模数(Modulus):用于 RSA 公钥。
- 指数(Exponent):通常为 65537。
8. 扩展字段(Extensions)
扩展字段为版本 3 中新增,包含额外信息。
基本约束(Basic Constraints)
X509v3 Basic Constraints: critical
CA:TRUE
CA:TRUE
表示该证书是 CA 证书。
密钥用途(Key Usage)
X509v3 Key Usage: critical
Digital Signature, Certificate Sign
- 定义证书的用途,如签名、密钥加密、证书签发。
扩展密钥用途(Extended Key Usage)
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
- 特定用途的扩展:
TLS Web Server Authentication
:HTTPS 服务器验证。TLS Web Client Authentication
:客户端验证。
主题备用名称(Subject Alternative Name, SAN)
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, IP Address:192.168.1.1
- 定义证书绑定的域名和 IP 地址。
9. 签名(Signature)
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
72:a3:12:...:e5
- CA 使用其私钥对证书的签名。
- 验证时,使用 CA 的公钥检查签名是否有效。
工具解析 X.509 证书
OpenSSL
openssl x509 -in certificate.pem -text -noout
结果输出示例
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
01:02:03:04
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=Example CA
Validity
Not Before: Jan 1 00:00:00 2023 GMT
Not After : Jan 1 00:00:00 2033 GMT
Subject: C=US, O=Example Organization, CN=example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:c1:23:...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com
总结
X.509 证书包含详细的字段用于身份验证、安全通信等任务。它通过 Issuer
(颁发者)、Subject
(持有者)、Public Key Info
(公钥信息)等核心字段构建信任链,同时扩展字段(如 SAN、Key Usage)定义其具体用途。
X.509 证书的签名过程是对证书的特定字段进行摘要处理,然后使用证书颁发机构(CA)的私钥对摘要结果进行加密。签名用于验证证书的完整性和来源。
签名是对哪些字段实行摘要处理?
签名涵盖的是证书的TBS(To Be Signed)部分,即证书主体部分。以下是具体包括的字段:
1. 版本号(Version)
- 指示 X.509 证书的版本(通常为 3)。
2. 序列号(Serial Number)
- 证书的唯一标识。
3. 签名算法标识符(Signature Algorithm Identifier)
- 表示 CA 选择的签名算法,例如
sha256WithRSAEncryption
。
4. 发行者信息(Issuer)
- 描述颁发证书的 CA 信息,包括组织名称、国家代码等。
5. 有效期(Validity)
- 包括两个子字段:
- Not Before:证书的起始生效时间。
- Not After:证书的过期时间。
6. 持有者信息(Subject)
- 描述证书持有者的信息,如域名、组织、邮箱等。
7. 主公钥信息(Subject Public Key Info)
- 包括:
- 公钥算法(如 RSA、ECDSA 等)。
- 公钥内容(例如 RSA 的模数和指数)。
8. 扩展字段(Extensions,版本 3 特有)
- 包括:
- 基本约束(Basic Constraints)
- 密钥用途(Key Usage)
- 扩展密钥用途(Extended Key Usage)
- 主题备用名称(Subject Alternative Name, SAN)
- 其他扩展。
签名流程
-
确定 TBS 部分:
- 将上述字段按照 ASN.1 编码(DER 格式)组合为一个二进制数据。
-
生成摘要:
- 使用指定的摘要算法(如 SHA-256)对 TBS 部分生成消息摘要。
-
签名摘要:
- 使用 CA 的私钥对消息摘要加密,生成签名。
-
添加到证书:
- 将签名值和签名算法附加到证书。
验证流程
- 从证书中提取 TBS 部分。
- 根据证书中的签名算法对 TBS 部分重新计算摘要。
- 使用 CA 的公钥解密签名值。
- 比较解密后的值与重新计算的摘要,若一致,则签名验证通过。
不包括的字段
签名过程不涵盖以下字段:
- 签名字段本身:签名是对
TBS
之外生成的,因此签名字段本身不被包含。 - 任何动态字段,例如证书的外部注释或额外的元信息。
通过这种方式,证书的签名确保了上述字段的完整性和不可篡改性。
浏览器验证证书的真实性时,会依据以下字段进行 CA 的查找和验证:
证书验证过程的关键字段
-
Issuer 字段
- 该字段标明证书的颁发者(Certificate Authority, CA),包括其国家(C)、组织名称(O)和通用名称(CN)。
- 作用:浏览器通过
Issuer
字段确定证书是由哪个 CA 签发的。
-
Subject Public Key Info
- 包含公钥信息,用于验证签名的正确性。
- 作用:浏览器利用 CA 的公钥来解密证书签名,确认它是否由声明的 CA 签发。
-
Signature
- 包含证书数据的数字签名,由 CA 的私钥生成。
- 作用:通过数字签名,验证证书内容是否完整且未被篡改。
-
Certificate Chain
- 每张证书会包含其
Issuer
,而浏览器会递归查找 CA 的上级证书,直到找到可信任的根证书。 - 作用:形成一个证书链,从服务器证书到受信任的根 CA。
- 每张证书会包含其
-
Authority Information Access (AIA) 扩展
- 可选字段,通常指向一个 URL,包含颁发 CA 的公钥证书。
- 作用:如果证书链中间部分缺失,浏览器可以通过 AIA URL 自动下载并补充。
浏览器的验证步骤
-
解析证书的
Issuer
字段- 查找与
Issuer
中描述的 CA 匹配的证书。 - 在本地的受信任根 CA 存储中查找,也可能通过 AIA 扩展或在线资源下载。
- 查找与
-
验证数字签名
- 使用上一级 CA 的公钥,验证证书的签名是否正确。
- 例如,浏览器会用上级 CA 的公钥解密当前证书的签名,并比较解密结果和当前证书的内容摘要。
-
检查证书链
- 确认证书链是否完整,所有中间证书是否与声明的 CA 一致。
- 从服务器证书开始,逐级验证每一级
Issuer
是否在本地或受信任的根 CA 列表中。
-
验证信任关系
- 确认最终的根 CA 是否在浏览器的受信任 CA 列表中。
- 例如,
Mozilla
,Microsoft
, 和Apple
会预装受信任 CA 列表。
-
检查证书有效期
- 验证证书是否在
Not Before
和Not After
规定的时间范围内。
- 验证证书是否在
-
检查吊销状态
- 检查是否通过 CRL(证书吊销列表)或 OCSP(在线证书状态协议)标记为吊销。
总结
- 浏览器根据证书的
Issuer
字段,结合 CA 的公钥验证签名,确保真实性。 - 然后通过
Certificate Chain
找到根证书,确保整个信任链是可信的。 - 最终,通过校验数字签名和证书吊销状态,判断证书的真实性和有效性。
CT Precertificate SCTs (Signed Certificate Timestamps) 解析
Signed Certificate Timestamps (SCTs) 是与证书透明性 (Certificate Transparency, CT) 相关的重要数据结构。它们是由公开日志服务器签名的时间戳,用于证明证书已经提交到 CT 日志中。这些信息对防止不受信任的证书的滥发非常关键。
字段解析
1. CT Precertificate SCTs
CT Precertificate SCTs 是证书透明性的一个组成部分。它们包含以下信息:
-
Version
- 显示 SCT 的版本。
- 示例:
v1 (0x0)
表示使用 CT 的第一版协议。
-
Log ID
- 由日志服务器生成的唯一标识符,用于识别该 SCT 是由哪个日志服务器生成的。
- 示例:
76:FF:88:3F:0A:B6:FB:95:51:C2:61:CC:F5:87:BA:34: B4:A4:CD:BB:29:DC:68:42:0A:9F:E6:67:4C:5A:3A:74
-
Timestamp
- 记录提交到日志服务器的时间戳。
- 格式:标准的 GMT 时间。
- 示例:
Sep 7 14:55:38.911 2024 GMT
。
-
Extensions
- 扩展字段,通常为空 (
none
)。
- 扩展字段,通常为空 (
-
Signature
- 使用
ecdsa-with-SHA256
签名算法对 SCT 进行签名,确保完整性和真实性。 - 签名数据:
30:44:02:20:1E:C0:96:A9:37:83:29:3E:08:BE:F5:3D:...
- 使用
2. 两个示例 SCT
在实际的证书中,通常包含多个 SCT,这些 SCT 来自不同的日志服务器。每个 SCT 包括上述字段的信息。
SCT 的作用
-
保证证书提交到 CT 日志
- SCT 是对证书已经提交到日志服务器的证明,目的是让证书的存在公开化。
-
增强信任
- 浏览器可以通过验证 SCT 确认证书的合法性,进而决定是否信任该证书。
-
防止证书滥发
- 强制要求证书颁发机构 (CA) 在发放证书时提交到 CT 日志,帮助检测和防范未经授权的证书。
如何验证 SCT
-
使用 OpenSSL OpenSSL 无法直接验证 SCT,但可以解析证书并检查 SCT 是否存在。
-
使用专用工具
- 工具如
certigo
或crt.sh
等可直接验证证书中的 SCT 信息。
- 工具如
-
手动解析并验证
- 提取证书中的 SCT,验证签名是否匹配日志服务器的公钥。
SCT 的上下文示例
在现代 HTTPS 环境下,CT 和 SCT 是证书生态系统的重要组成部分,尤其是在防范证书滥发和透明性方面。例如:
- Google Chrome 等浏览器要求证书必须附带 SCT,否则将提示“不受信任”。
这种机制对增强网络安全具有重要意义。