目录
授权密钥标识符(Authority Key Identifier, AKI)
主题密钥标识符(Subject Key Identifier, SKI)
背景
数字证书是网络安全领域的基石,提供了身份验证和加密通信的能力。数字证书遵循一系列的技术标准,其中最重要的是X.509标准。X.509是国际电信联盟(ITU-T)制定的一套关于公钥证书的标准,广泛应用于互联网和私有网络中。它定义了证书的格式和内容,以及如何使用证书链来建立信任关系。
数字证书基本原理
数字证书是基于公钥基础设施(Public Key Infrastructure,PKI)的一种技术,其基本原理涉及到非对称加密、信任链和数字签名。以下是数字证书的基本原理:
-
非对称加密:
- 在非对称加密系统中,每个参与者都有一对密钥:公钥和私钥。
- 公钥可以公开分享,而私钥必须保密。
- 使用公钥加密的数据只能用相应的私钥解密,反之亦然。
- 这种机制允许安全地交换信息,即使是通过不安全的通信渠道。
-
数字签名:
- 使用私钥对数据(如证书、文件或消息)进行加密,产生的加密数据称为数字签名。
- 数字签名可以用对应的公钥进行验证,以确保信息是由持有私钥的实体签发,并且没有被篡改。
- 数字签名不仅提供了信息的完整性验证,还提供了发送者的身份验证。
-
证书颁发机构(CA):
- CA是一个受信任的第三方机构,负责验证实体的身份并为其颁发数字证书。
- 数字证书包含了证书主题的信息(如个人、组织或设备)、公钥、证书有效期等。
- CA使用自己的私钥对证书进行签名,任何拥有CA公钥的人都可以验证该证书。
-
信任链:
- 数字证书通常是链式结构,根CA位于信任链的顶端,由根CA签名的中间CA证书形成信任链条。
- 中间CA可以再签发其他证书,这样就形成了从根CA到最终证书的信任路径。
- 用户信任根CA,并预装其公钥,以此为基础对整个信任链中的证书进行验证。
-
证书验证:
- 当需要验证证书时(如在TLS握手过程中),客户端软件(如Web浏览器)会检查证书的签名、有效期、吊销状态等。
- 软件通过信任链逐级向上验证,直到可信的根CA证书。
- 如果证书链的所有证书都通过验证,证书就被认为是有效的。
通过这些基本原理,数字证书为在线通信提供了一个安全的验证机制,使得参与者能够验证彼此的身份,并确保数据在传输过程中的安全性和完整性。
数字证书的文件格式
PEM(Privacy Enhanced Mail):以"-----BEGIN CERTIFICATE-----"和"-----END CERTIFICATE-----"包围的Base64编码的文本格式,是最常见的格式。
DER(Distinguished Encoding Rules):使用ASN.1的DER编码的二进制格式,常用于Java平台。
PFX/P12:包含证书和私钥的加密格式,通常用于Windows平台。
CER/ CRT:通常表示一个未加密的PEM或DER格式证书。
数字证书类型
根据应用场景和用途的不同,数字证书可以分为多种类型,包括:
- SSL/TLS证书:用于网站和服务器的身份验证和数据加密。
- 代码签名证书:用于确认软件的出版者身份和代码未被篡改。
- 邮件签名证书:用于电子邮件的签名和加密。
- 客户端证书:用于身份验证,如VPN或企业网络访问。
数字证书关键字段
数字证书包含多个字段,每个字段都承载着关键的信息
颁发机构(Issuer)
签发证书的CA的信息。
-
Common Name (CN): 对于SSL/TLS证书,CN通常是证书用于保护的完整域名(例如
www.example.com
)。对于个人证书,这可能是个人的名字或身份标识符。 -
Organization (O): 表示证书持有者所属的公司或组织的官方名称。
-
Organizational Unit (OU): 表示证书持有者所属的公司或组织内的部门或分支。
-
Country (C): 表示证书持有者所在国家的两个字母国家代码(例如
US
表示美国)。 -
State or Province (ST): 表示证书持有者所在的州或省。
-
Locality (L): 表示证书持有者所在的城市或地区。
主体名称(Subject Name)
证书所有者的身份信息,如组织名称和域名。
指定了证书所有者的身份信息。这个字段是证书的一部分,用于唯一标识证书的主体——也就是证书所属的个人、服务器或组织。
具体字段可以参考Issuer。
有效期(Validity Period)
证书从颁发之日起到其失效为止的时间范围。在这个时间段内,证书被视为有效和可信的。数字证书的有效期设置通常取决于证书颁发机构(Certificate Authority, CA)的策略,以及证书用途的具体需求。证书的有效期可以是一年、两年、三年,甚至更长或更短的时间。
-
Not Before(生效时间):这是证书开始生效的日期和时间。在此之前,证书不应被接受或信任为有效。
-
Not After(过期时间):这是证书有效期的终止日期和时间。在此时间之后,证书被视为过期,不再被接受或信任。
序列号(Serial Number)
证书颁发机构(CA)为每个颁发的证书分配的一个唯一编号。这个序列号是证书的必要部分,因为它允许区分来自同一CA的不同证书,即使这些证书的其他属性(如主题或公钥)相同。
序列号的主要特点和用途包括:
-
唯一性:每个证书的序列号都应该是唯一的,至少在颁发它的CA的范围内。这意味着任何给定CA颁发的任何两个证书都不应该有相同的序列号。
-
不可预测性:为了安全起见,序列号应该是不可预测的,这样攻击者就不能轻易猜测或伪造证书序列号。
-
证书吊销:序列号在证书管理中起着关键作用,特别是在证书吊销的过程中。当需要吊销证书时,CA会将该证书的序列号添加到证书吊销列表(CRL)中。客户端软件(如Web浏览器)可以检查CRL以确定证书是否已被吊销。
-
证书跟踪:序列号还可以用于跟踪和管理证书,例如,在证书生命周期管理系统中。
数字证书的序列号通常是一个正整数,可以是任意长度,但通常遵守一定的编码规则,如ASN.1编码。在实践中,序列号的长度通常不会超过20个八位字节(即160位),这足以确保全局唯一性。
签名算法(Signature Algorithm)
证书的签名是由证书颁发机构(CA)的私钥生成的,它确保了证书的内容没有被篡改,并证实了证书颁发机构对证书中包含的公钥和其他信息的认可。接收方将使用CA的公钥(通常包含在CA的根证书或中间证书中)来验证签名。
"Signature Algorithm"字段通常包含如下信息:
-
散列算法(Hash Algorithm):用于创建证书内容摘要的算法,例如SHA-256、SHA-384等。散列算法应该是安全的,以确保不能找到两个不同的证书内容,它们生成相同的摘要值(这种情况称为散列冲突)。
-
签名算法(Signature Algorithm):用于加密散列摘要的算法,例如RSA、ECDSA(椭圆曲线数字签名算法)等。签名算法使用CA的私钥来加密散列摘要。
在实际的数字证书中,"Signature Algorithm"字段可能会显示为类似以下的值:
sha256WithRSAEncryption
:表示使用SHA-256散列算法和RSA加密算法。ecdsa-with-SHA256
:表示使用SHA-256散列算法和ECDSA签名算法。sha1WithRSAEncryption
:表示使用SHA-1散列算法和RSA加密算法(SHA-1现在被认为是不安全的,不推荐使用)。
公钥(Public Key)
包含证书主体的公钥信息。公钥是非对称加密系统中的一部分,与私钥配对使用。私钥必须保密,而公钥可以公开。这对密钥用于执行如下操作:
-
加密数据:公钥可以被任何人用来加密数据,但只有持有对应私钥的实体能够解密这些数据。这常用于确保信息的机密性。
-
验证数字签名:私钥用于生成数字签名,而公钥则用于验证签名的真实性。这可以证明信息未被篡改,并确认信息是由持有私钥的实体发送的。
在X.509数字证书中,“Public Key”字段的结构如下:
- 公钥算法:指明用于公钥的非对称加密算法,例如 RSA、DSA 或 ECDSA。
- 公钥:实际的公钥数据,其格式和长度取决于所用的公钥算法。
例如,如果证书使用RSA公钥,那么“Public Key”字段会包含一个RSA公钥,它由两个主要数值组成:模数(modulus)和公钥指数(public exponent)。模数是两个大素数的乘积,而公钥指数通常是一个预定义的常数,例如65537。
密钥用途(Key Usage)
一个重要的扩展字段,它定义了证书中包含的公钥的允许使用方式。这个字段限制了公钥的功能,以确保它只被用于预期的特定目的。这有助于增加安全性,并且允许实施策略以限制密钥的使用。
"Key Usage"扩展可以包含下列标志(不是所有标志都必须存在):
-
digitalSignature:允许公钥用于验证数字签名,这通常用于证实发送的数据是未被篡改的,并且是由持有相应私钥的实体签署的。
-
nonRepudiation:允许公钥用于验证签名,以防止发送方否认之前发送过的信息。这通常用于具有法律或合同意义的场合。
-
keyEncipherment:允许公钥用于加密会话密钥,这样只有持有对应私钥的接收方才能解密这个会话密钥,并用其解密信息。
-
dataEncipherment:允许公钥直接用于加密数据,而不是加密会话密钥。
-
keyAgreement:允许公钥用于协商共享密钥,例如在椭圆曲线加密中的密钥协商。
-
keyCertSign:允许公钥用于签署其他证书,这意味着证书可以作为证书颁发机构(CA)使用。只有CA证书才应该具有这个用途。
-
cRLSign:允许公钥用于签署证书吊销列表(CRLs),这些列表包含了被CA撤销的证书序列号。
-
encipherOnly:仅允许公钥用于加密数据,通常与keyAgreement一起使用。
-
decipherOnly:仅允许公钥用于解密数据,通常与keyAgreement一起使用。
基本限制(Basic Constraints)
是一个扩展字段,用于指示证书的类型以及证书主体是否有权限签发其他证书。这个扩展是非常重要的,因为它可以用来区分证书颁发机构(CAs)的证书和终端实体(如个人、服务器)的证书。
“Basic Constraints”扩展包含以下几个组成部分:
-
CA(Certificate Authority)标志:此标志指示证书是否可以用作CA证书。
-
如果设置为TRUE,证书持有者可以使用它来签发其他证书,这意味着它是一个CA证书。
-
如果设置为FALSE或该标志不存在,则证书不用于签发其他证书,即它是一个终端实体证书。
-
-
pathLenConstraint:此选项仅在CA字段为TRUE时才有意义,它定义了证书链中下级CA证书的最大允许数量。例如,如果设置为0,则表示该CA证书只能用来直接签发终端实体证书,而不能签发其他CA证书。如果没有设置这个限制,则CA可以签发任意数量的下级CA证书。
授权密钥标识符(Authority Key Identifier, AKI)
用来帮助唯一地标识证书颁发机构(CA)的公钥的。AKI扩展对于构建证书链非常有用,因为它提供了一个链接到颁发证书的CA的标识符,这有助于证书验证过程中的证书链验证。
“Authority Key Identifier”扩展通常包含以下信息:
-
keyIdentifier:这是从CA的公钥中派生的一个唯一标识符。它通常是CA公钥的一个散列值(例如,使用SHA-1算法),这个散列值可以用来快速比较和确认CA证书的公钥。
-
authorityCertIssuer:这是一个可选字段,包含颁发CA证书的颁发者名称。它是一个指向CA证书颁发者的链接,可以用来在证书链中回溯查找。
-
authorityCertSerialNumber:这也是一个可选字段,包含颁发CA证书的序列号。与“keyIdentifier”一起,这个字段提供了在证书库中查找CA证书所需的足够信息。
“Authority Key Identifier”扩展对于区分具有相同颁发者名称的不同CA证书特别有用。当CA证书需要更新或替换时,可以通过AKI来确保证书链中每个证书正确指向其特定的颁发证书。
主题密钥标识符(Subject Key Identifier, SKI)
用来唯一标识证书中的公钥的。SKI通常是从公钥本身生成的一个散列值,它为证书链的构建和证书路径的验证提供了一种机制。
这个扩展的主要目的是在有多个证书拥有相同主题名称的情况下,帮助唯一地识别这些证书中的公钥。这在证书的续订和吊销过程中尤其重要,以确保证书链中各个证书正确地链接到其对应的实体。SKI扩展通常包含以下信息:
- keyIdentifier:这是证书主体的公钥的散列值,通常使用SHA-1或其他散列算法计算得出。这个散列值作为证书的公钥的唯一标识符。
通过使用SKI,可以在验证证书链时确保每个证书都准确地指向其上游的证书颁发机构(CA)。这有助于简化证书链的处理,提高验证过程的效率。