数字证书通过提供有关证书主题,证书有效性以及可以使用证书的应用程序和服务的信息,将用户,计算机或服务的标识绑定到公钥。PKI中颁发的证书的结构是为了根据互联网工程任务组(IETF)的公钥基础设施(X.509)工作组(PKIX)制定的标准来实现这些目标。
什么是数字证书?
下图显示了X.509版本3证书的内容
X.509版本3证书支持自X.509版本1以来支持的以下字段:
-
主题:提供CA颁发证书的计算机,用户,网络设备或服务的名称。主题名称通常使用X.500或轻量级目录访问协议(LDAP)格式表示。
-
序列号:为CA颁发的每个证书提供唯一标识符。
-
颁发者:为颁发证书的CA提供专有名称。发行者名称通常使用X.500或LDAP格式表示。
-
有效自:提供证书生效的日期和时间。
-
有效收件人:提供证书不再有效的日期和时间。应用程序或服务评估证书的日期必须介于证书的Valid From和Valid To字段之间,以使证书有效。
-
公钥:包含与证书关联的密钥对的公钥。
-
签名算法:用于签署证书的算法。
-
签名值:包含数字签名的位串。
除版本1字段外,X.509版本3证书还包括为证书提供附加功能和功能的扩展。这些扩展是可选的,并不一定包含在CA颁发的每个证书中:
-
主题替代名称:主题可以以多种不同的格式呈现。例如,如果证书必须包含LDAP专有名称,电子邮件名称和用户主体名称(UPN)格式的用户帐户名,则可以通过添加证书中的电子邮件名称或UPN包含这些附加名称格式的主题备用名称扩展名。
-
CRL分发点(CDP): 当用户,服务或计算机提供证书时,应用程序或服务必须确定证书是否在其有效期到期之前被撤销。CDP扩展提供一个或多个URL,应用程序或服务可以从中检索证书吊销列表(CRL)。
-
授权信息访问(AIA): 在应用程序或服务验证证书后,还必须评估颁发证书的CA的证书(也称为父CA)的撤销和有效性。AIA扩展提供一个或多个URL,应用程序或服务可以从中检索颁发的CA证书。
-
增强型密钥用法(EKU): 此属性包括可用于证书的每个应用程序或服务的对象标识符(OID)。每个OID都是来自全球注册机构的唯一数字序列。
-
证书策略: 描述组织在颁发证书之前验证证书请求者身份所采取的措施。OID用于表示验证过程,并且可以包括策略限定的URL,该URL完整地描述了验证身份所采取的措施。
分类
商业CA将类的概念用于不同类型的数字证书。例如,VeriSign具有以下分类
- 用于个人的1级,用于电子邮件。
- 组织的第2类,需要身份证明。
- 服务器和软件签名的第3类,由发证机构对其进行独立验证和检查身份和权限。
- 第4类用于公司之间的在线业务交易。
- 私人组织或政府安全的第5类。
其他供应商可能会选择使用不同的类或根本没有类,因为规范中没有指定,但大多数供应商都选择以某种形式使用类。
证书格式和编码
X.509数字证书格式使用ASN.1或抽象语法表示法一来定义,是一种国际标准组织(ISO)数据表示格式,用于实现平台之间的互操作性。
X.509 v3数字证书的当前结构如下所示。这基本上定义了如何编写证书内容。你可以在这里查看详细信息。
证书:: = SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING}
TBSCertificate :: = SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
签名AlgorithmIdentifier,
发行人姓名,
有效性,
主题名称,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier可选,
- 如果存在,版本必须是v2或v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier可选,
- 如果存在,版本必须是v2或v3
extensions [3] EXPLICIT Extensions可选
- 如果存在,版本必须是v3
}
AlgorithmIdentifier :: = SEQUENCE {
算法OBJECT IDENTIFIER,
参数ANY DEFINED BY algorithm OPTIONAL}
....更多定义将遵循CertificateSerialNumber,Name,Validity等......
您可以将其视为Java类或XML架构。它确实定义了如何编码证书内容以存储在文件中。两种常用的编码模式用于在文件,DER和PEM中存储X.509证书,如下一节所述。可以将这种ASN.1定义的编码形式与Java中的.class文件进行比较。
PEM(隐私增强邮件)编码
X.509证书文件最常用的编码方案是PEM(隐私增强邮件)编码。PEM的完整规范在RFC 1421中。但是在X.509证书上进行PEM编码的想法非常简单:
使用Base64编码对内容进行编码。
将Base64编码输出括在两行之间:“—– BEGIN CERTIFICATE —–”和“—– END CERTIFICATE —–”
这是PEM编码的结构示例X.509证书:
-----BEGIN CERTIFICATE-----
MIIDODCCAvagAwIBAgIERqplETALBgcqhkjOOAQDBQAwfzELMAkGA1UE
...
...
Cgfs2kXj/IQCFDC5GT5IrLTIFxAyPUo1tJo2DPkK
-----END CERTIFICATE-----
几乎所有应用程序都支持PEM编码的证书文件,证书的扩展名为.pem
DER(可分辨编码规则)编码
DER(可分辨编码规则)是另一种用于存储X.509证书文件的流行编码。ASN.1的可分辨编码规则是根据X.509对BER编码的约束得出的国际标准。DER编码是有效的BER编码。DER与BER相同,只删除了一个发送者的选项。例如,在BER中,布尔值true可以用255种方式编码,而在DER中,只有一种方法可以编码布尔值true。DER的完整规范在RFC 1421中。
DER编码的X.509证书文件是二进制文件,无法使用文本编辑器查看。几乎所有应用程序都支持DER编码的证书文件。DER编码证书的文件扩展名为.cer,.der,.crt
PKCS格式
PKCS是指由RSA Security设计和发布的一组公钥加密标准。因此,RSA Security及其研究部门RSA Labs有兴趣促进和促进公钥技术的使用。为此,他们(从20世纪90年代初开始)开发了PKCS标准。他们保留对他们的控制权,宣布他们会在他们认为必要的时候进行改变/改进,因此PKCS标准在重要意义上并不是真正的行业标准,尽管名称如此。近年来,有些(但不是全部)已经开始进入像IETF PKIX工作组这样的标准组织。
在这种情况下,文件扩展名为.p7b,.p7c,.p12,.pfx等。
真实的例子
让我们检查一下真正的证书,它的细节和链条。感谢上帝有证书查看器工具,读取这些古老的编码格式,并很好地显示证书!您可以在任何浏览器中检查任何https网址以检查X.509数字证书。在这里,我们将在Internet Explorer(IE)中检查印度国家银行的网上银行网站。
转到https://www.onlinesbi.com/并单击查看证书链接,如下所示。
单击视图证书链接后,Windows证书查看器工具将打开并显示印度国家银行拥有的证书。您可以在“颁发者”字段中看到此证书由VeriSign Class 3 Extended Validation SSL SGC CA颁发。
证书查看器还显示证书的详细信息。有许多字段,“显示”下拉列表会过滤它们以便更好地查看。下图显示了一些称为版本1字段的基本字段。在左侧,您可以看到主题SBI及其详细信息名称(DN)。在正确的发行人的DN上。
从show下拉列表中选择“Extensions Only”。请注意扩展名是可选的,但它们现在很常见。在左侧,您将看到CRL分发点和右侧AIA位置。
您可以单击http://EVIntl-crl.verisign.com/EVIntl2006.crl下载CRL。下图显示了CRL的外观。每个证书通常指向其发行人给出的CRL。
单击“证书路径”选项卡以查看证书链。证书查看器允许您通过突出显示证书来查看链中的其他证书,然后单击“查看证书”按钮,如右下图所示。链中还显示VeriSign是一个双层CA,其中VeriSign是Root,“VeriSign Class 3 Extended Validation SSL SGC CA”是颁发CA.
单击“查看证书”按钮以查看颁发者CA的证书。您也可以使用AIA链接,即http://EVIntl-aia.verisign.com/EVIntl2006.cer来获得相同的证书。
发行人CA的证书如下。
同样,您也可以看到根证书。请注意,对于根证书,“颁发给”或“主题”和“颁发者”或“颁发者”字段是相同的。所以这是一个自签名证书。
您还可以使用Chrome和Firefox查看证书。Chrome使用IE的证书查看器,但FF使用自己的证书查看器。
证书验证过程
在信任证书之前,浏览器/应用程序会执行验证检查以确保证书有效并且它们具有有效的证书路径。公钥证书的状态通过三个不同但相互关联的过程来确定。但这可能会因实施而略有不同。
证书发现或连锁建筑
链构建过程将通过检查证书路径中的每个证书(从最终证书到根CA证书)来验证证书路径。从中级证书颁发机构存储,受信任的根证书颁发机构存储或证书的AIA属性中指定的URL检索证书。如果它发现路径中的某个证书存在问题,或者找不到证书,则证书路径将作为不受信任的证书路径被丢弃。
为了提高性能,浏览器/操作系统可以将下级CA证书存储在中间证书颁发机构存储中,以便可以从存储中满足将来对证书的请求,而不是通过URL访问证书。
证书存储
证书存储通常包含许多证书,可能是从许多不同的CA颁发的。在Windows系统中,存在称为计算机存储的单独存储(由计算机使用),以及当前登录用户使用的用户存储或我的存储。
在Java环境中,证书存储在JKS文件中,并由“系统属性”指向
-Djavax.net.ssl.keyStore = $ {some path} /keystore.jks
-Djavax.net.ssl.trustStore = $ {some path} /cacerts.jks
-Djavax.net.ssl.keyStorePassword = key-store-password
目的
证书链引擎构建所有可能的证书链。构建证书链的整个图表,然后按链的“质量”排序。给定结束证书的最佳质量链作为默认链返回给调用应用程序。
每个链都是使用证书存储中可用的证书和已发布的URL位置提供的证书的组合构建的。链中的每个证书都分配有一个状态代码。状态代码指示单个证书是否:
- 签名有效签名是否有效?
- 时间有效是否正确配置了证书开始日期和到期日期,尚未发生开始日期,或证书是否已过期?
- 已过期证书是否已过期?
- 已撤销证书已被撤销?
- 时间嵌套PKI层次结构中任何更高的证书是否已过期?
-
对证书的任何其他限制例如,证书是否用于非预期目的?
每个状态代码都有一个优先级。例如,过期的证书优先级高于撤销的证书。这是因为不应检查过期证书的撤销状态。
如果为证书链中的证书分配了不同的状态代码,则优先级最高的状态代码将应用于证书链并传播到证书链状态。
路径验证
对于链中的每个证书,证书链引擎必须选择颁发CA的证书。重复此过程(称为路径验证),直到达到自签名证书(通常,这是根CA证书)。
可以使用不同的进程为颁发CA选择证书。使用的实际过程基于当前正在调查的证书是否已定义权限密钥标识符(AKI)扩展。检查AKI扩展将导致实施三个匹配过程之一:
-
完全匹配如果AKI扩展包含颁发者的用户名和颁发者序列号,则在链构建过程中将仅选择与用户名和序列号匹配的证书。作为进一步测试,颁发的证书上的颁发者名称必须与颁发者证书上的主题名称匹配。
-
密钥匹配如果AKI扩展仅包含公钥信息,则只有在主题密钥标识符(SKI)扩展中包含指示公钥的证书才会被选为有效发布者。
- 名字匹配。如果AKI中不存在任何信息,或者证书中不存在AKI,则证书将被标记为“名称匹配”。在名称匹配中,证书的主题名称必须与当前证书中的颁发者名称匹配。证书的订单被选为有效的发行人。由于数据以二进制格式存储,因此名称匹配过程区分大小写。
在所有情况下,即使在商店中找不到匹配的证书,当前证书仍将被标记为“完全匹配”,“密钥匹配”或“名称匹配”,因为这描述了尝试的匹配而不是达到的匹配。
高速缓存
为了提高性能,证书链引擎使用最近最少使用(LRU)的缓存方案。此方案为构建证书链时遇到的每个证书创建一个缓存条目。每个缓存条目都包含证书的状态,因此可以在后续调用链接API时根据缓存项构建最佳证书链,而无需再次确定每个证书的状态。将证书添加到缓存后,在证书过期或被撤销之前不会将其删除。
在路径验证过程中,将始终选择有效的缓存证书。如果未找到有效的高速缓存证书,则将执行商店搜索。对于颁发者证书和CRL,可能需要URL检索才能从URL中指示的分发点下载证书和CRL。
从商店或URL中选择证书时,所有证书都存储在缓存中。唯一的区别是存储缓存证书的位置。
废止
证书链引擎将检查链中的每个证书,以确定证书是否已被撤销以及撤销的原因。撤销检查可以与链式构建过程一起进行,也可以在链条构建之后进行。如果在链中发现撤销的证书,则为该链分配较低的质量值。