数字证书和证书颁发机构的基础知识

 

 

什么是数字证书


数字证书是电子凭证,用于断言网络上的个人,计算机和其他实体的在线身份。数字证书的功能类似于护照和驾驶执照等身份证。最常见的是,它们包含公钥和所有者的身份。它们由证书颁发机构(CA)颁发,证书颁发机构必须在颁发证书之前和使用证书时验证证书持有者的身份。常见用途包括需要身份验证,加密和数字签名的业务场景。

证书目的


证书目的定义了证书的预期主要用途。证书目的可以是以下四种设置之一:

  • 加密。具有此目的的证书将包含用于加密和解密的加密密钥。
  • 签名。具有此目的的证书将包含仅用于签名数据的加密密钥。
  • 签名和加密。具有此目的的证书涵盖证书加密密钥的所有主要用途,包括数据加密,数据解密,初始登录或数字签名数据。
  • 签名和智能卡登录。具有此目的的证书允许使用智能卡进行初始登录,并对数据进行数字签名; 它不能用于数据加密。
SSL可能是第一个使用数字证书的协议。现在有一天,它们被广泛用于需要签名和加密的地方。

证书颁发机构


证书颁发机构(CA)颁发包含公钥和所有者身份的数字证书。匹配的私钥不是公开的,而是由生成密钥对的最终用户保密。证书还是CA的确认或验证,证书中包含的公钥属于证书中标注的个人,组织,服务器或其他实体。CA在此类方案中的义务是验证申请人的凭证,以便用户和信赖方可以信任CA证书中的信息。CA使用各种标准和测试来执行此操作。从本质上讲,证书颁发机构负责说“是的,这个人就是他们所说的人,而我们,CA,验证”。

如果用户信任CA并且可以验证CA的签名,那么他还可以验证某个公钥确实属于证书中标识的任何人。浏览器维护着名的CA根证书列表。除了商业CA之外,一些提供商还免费向公众发放数字证书。大型机构或政府实体可能拥有自己的CA.

CA层次结构

CA在结构上是分层的。通常有三种类型的层次结构,它们由层数表示。

单层/单层层次结构

单层层次结构由一个CA组成。单个CA既是根CA又是颁发CA. 根CA是PKI的信任锚的术语。信任根CA的任何应用程序,用户或计算机都信任CA层次结构颁发的任何证书。颁发CA是向最终实体颁发证书的CA. 出于安全原因,这两个角色通常是分开的。使用单层层次结构时,它们将合并在一起。 
 

两层层次结构


双层层次结构是最常见的。在某些方面,它是一层和三层等级之间的折衷。在此设计中,有一个脱机的根CA,以及一个在线的从属颁发CA. 由于根CA和颁发CA角色是分开的,因此安全级别会提高。但更重要的是,根CA处于脱机状态,因此可以更好地保护根CA的私钥免受攻击。它还提高了可扩展性和灵活性。这是因为可以存在多个从根CA到CA的颁发CA. 这可以让你有CA在不同的地理位置,以及与不同的安全级别。 
 

三层层次结构



具体而言,两层层次结构之间的区别在于第二层位于根CA和颁发CA之间。此CA的放置可能有几个不同的原因。第一个原因是将第二层CA用作策略CA. 换句话说,策略CA配置为向颁发CA颁发证书,该证书受其颁发的证书类型的限制。策略CA也可以仅用作管理边界。换句话说,您只从策略CA的下属颁发某些证书,并在颁发证书之前执行某种级别的验证,但该策略仅从管理而非技术角度强制执行。

添加第二层的另一个原因是,如果由于密钥泄露而需要撤销多个CA,则可以在第二层级别执行它,从而使其他“从根分支”可用。应该注意的是,此层次结构中的第二层CA可以像Root一样保持脱机状态。
 
 
 
 

从CA获取证书

您可以从商业CA获取业务证书。商业CA的发行实体提供成本证书。
用户可以直接联系发证CA,在这种情况下,发行CA将代表用户生成密钥对。将私钥移交给用户,并在根据CA的策略进行所有必要的验证后,提供包含公钥的证书和颁发CA的签名。

用户还可以使用Java中的Keytool等工具生成自己的密钥对,并再次使用某个工具生成证书签名请求(CSR),例如Keytool,然后将CSR发送给颁发CA以获取证书。CSR以发布CA通常期望的格式包含用户的公钥和用户身份信息。


用户必须保密私钥。如果私钥被泄露或丢失,则必须通知CA。这类似于丢失信用卡。CA将证书保留在证书撤销列表中,其私钥被认为已被泄露或丢失。

您自己可以成为CA并颁发自己的证书,这些证书称为自签名证书,但出于商业目的,您的自签名证书将不受信任。只有已建立且知名的CA自签名证书才是可信的。CA的根证书始终是自签名的。
 

证书链或证书路径

当您从商业CA获得公钥证书时,您的证书将与证书链相关联,或者有时称为信任链。链中的证书数量取决于CA的层次结构。下图显示了双层CA的证书链。所有者/用户证书由颁发CA签名,颁发CA证书由根CA签名。根CA的证书是自签名的。
  

在用户通过浏览器或程序验证证书期间,浏览器需要通过查找下一个颁发CA或中间CA的公钥来验证签名。该过程将继续,直到达到根证书。根CA是自签名的,最后必须由浏览器信任。浏览器将所有知名的CA根证书保存在其信任库中。

友邦保险地点

当客户端或应用程序验证证书时,它不仅需要验证正在使用的证书,还需要验证整个证书链。换句话说,应用程序或客户端需要来自链中每个CA的证书,该证书以发布CA开始并以根CA结束。如果应用程序或客户端无法访问本地链中的证书,则应用程序或客户端需要从中获取证书的位置。此位置称为“授权信息访问”或AIA。AIA位置是存储CA证书的存储库,以便客户端或验证证书的应用程序可以下载它。AIA位置包含在证书的AIA扩展中。

CDP地点

CRL分发点(CDP)是验证证书的客户端或应用程序下载证书吊销列表(CRL)以获取吊销状态的位置。CA定期发布CRL以允许客户端和应用程序确定证书是否已被撤销。CRL包含已撤销的证书的序列号,指示证书被撤销的时间戳以及撤销的原因。

证书剖析


数字证书通过提供有关证书主题,证书有效性以及可以使用证书的应用程序和服务的信息,将用户,计算机或服务的标识绑定到公钥。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

目的

证书链引擎构建所有可能的证书链。构建证书链的整个图表,然后按链的“质量”排序。给定结束证书的最佳质量链作为默认链返回给调用应用程序。

每个链都是使用证书存储中可用的证书和已发布的U​​RL位置提供的证书的组合构建的。链中的每个证书都分配有一个状态代码。状态代码指示单个证书是否:

  • 签名有效签名是否有效?
  • 时间有效是否正确配置了证书开始日期和到期日期,尚未发生开始日期,或证书是否已过期?
  • 已过期证书是否已过期?
  • 已撤销证书已被撤销?
  • 时间嵌套PKI层次结构中任何更高的证书是否已过期?
  • 对证书的任何其他限制例如,证书是否用于非预期目的?

每个状态代码都有一个优先级。例如,过期的证书优先级高于撤销的证书。这是因为不应检查过期证书的撤销状态。

如果为证书链中的证书分配了不同的状态代码,则优先级最高的状态代码将应用于证书链并传播到证书链状态。

路径验证

对于链中的每个证书,证书链引擎必须选择颁发CA的证书。重复此过程(称为路径验证),直到达到自签名证书(通常,这是根CA证书)。

可以使用不同的进程为颁发CA选择证书。使用的实际过程基于当前正在调查的证书是否已定义权限密钥标识符(AKI)扩展。检查AKI扩展将导致实施三个匹配过程之一:

  • 完全匹配如果AKI扩展包含颁发者的用户名和颁发者序列号,则在链构建过程中将仅选择与用户名和序列号匹配的证书。作为进一步测试,颁发的证书上的颁发者名称必须与颁发者证书上的主题名称匹配。 

  • 密钥匹配如果AKI扩展仅包含公钥信息,则只有在主题密钥标识符(SKI)扩展中包含指示公钥的证书才会被选为有效发布者。 

  • 名字匹配。如果AKI中不存在任何信息,或者证书中不存在AKI,则证书将被标记为“名称匹配”。在名称匹配中,证书的主题名称必须与当前证书中的颁发者名称匹配。证书的订单被选为有效的发行人。由于数据以二进制格式存储,因此名称匹配过程区分大小写。

在所有情况下,即使在商店中找不到匹配的证书,当前证书仍将被标记为“完全匹配”,“密钥匹配”或“名称匹配”,因为这描述了尝试的匹配而不是达到的匹配。

高速缓存

为了提高性能,证书链引擎使用最近最少使用(LRU)的缓存方案。此方案为构建证书链时遇到的每个证书创建一个缓存条目。每个缓存条目都包含证书的状态,因此可以在后续调用链接API时根据缓存项构建最佳证书链,而无需再次确定每个证书的状态。将证书添加到缓存后,在证书过期或被撤销之前不会将其删除。

在路径验证过程中,将始终选择有效的缓存证书。如果未找到有效的高速缓存证书,则将执行商店搜索。对于颁发者证书和CRL,可能需要URL检索才能从URL中指示的分发点下载证书和CRL。

从商店或URL中选择证书时,所有证书都存储在缓存中。唯一的区别是存储缓存证书的位置。

废止

证书链引擎将检查链中的每个证书,以确定证书是否已被撤销以及撤销的原因。撤销检查可以与链式构建过程一起进行,也可以在链条构建之后进行。如果在链中发现撤销的证书,则为该链分配较低的质量值。 

posted @ 2019-07-16 14:38  sunsky303  阅读(8601)  评论(0编辑  收藏  举报
显示搜索