X509证书详解(中文翻译)

英文原文:https://blog.csdn.net/blue0bird/article/details/78656536


本文源于英文文档,自己翻译,也参考了网上的其它翻译(对作者表示感谢!),力图更加准确。

文中介绍的OpenSSL版本较老,与现有的版本有很多不符之处,但万变不离其宗,核心原理还是很有参考价值的。

1)证书

在密码技术中,X.509是定义公钥证书格式的标准。X.509证书用于许多Internet协议,包括TLS/SSL,后者是Web安全协议HTTPS的基础。也可用于离线应用,比如电子签名。X.509证书包含公钥和标识(主机名、组织或个人),并由证书颁发机构(CA)签名,也可以自签名。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名。

  • 历史和用法

X.509最早与X.500一起发布于1988年7月3日,它假定颁发证书的证书颁发机构(CA)具有严格的层次结构。这与Web信任模型(如PGP)形成了鲜明对比,因为PGP方案是任何人都以签名(而不仅仅是地位特殊的CA),从而证明其他人的密钥证书的有效性。X.509 V3证书的设计非常灵活,除了对网桥拓扑架构网络的支持,还可以支持用于点对点方式的Mesh网,类似于OpenPGP那样的web信任机制,不过这样方式在2004年之前很少使用。

X.500系统仅由主权国家实施,以实现国家身份信息共享条约的实施目的,而IETF的公钥基础设施(X.509)或PKIX工作组已对该标准进行了调整,以适应更灵活的互联网组织结构。事实上,而且事实上X.509认证指的是RFC5280里定义的X.509 v3,包括对IETF的PKIX证书和证书吊销列表(CRL Profile),通常也称为公钥基础设施。

在X.509系统中,想要签署证书的组织通过发起“证书签名请求(CSR)”来得到一份证书。为此,它需要生成一个密钥对,将其中的私钥安全地保存(对外保密),并用私钥对CSR签名。CSR包含申请人的身份信息、用于对CSR请求文件验真的申请人的公钥,以及证书所使用的专有名称(DN),CSR还可能附带证书颁发机构要求的其他凭据或身份证明。

证书颁发机构对这个DN名称颁发一份证书,并绑定一个公钥。

可以将受到组织信任的根证书分发给所有成员,以便他们可以使用公司的PKI系统。 像Internet Explorer,FireFox,Safari和Chrome之类的浏览器都预先安装了一组根证书,因此你可以立即使用主流CA发布的SSL证书,浏览器的开发者直接影响它的用户对第三方的信任。FireFox就提供了一份csv/html格式的列表,其中包含CA列表。

X.509还包括证书吊销列表(CRL)实现的标准,这是PKI系统经常被忽略的方面。IETF批准的检查证书有效性的方法是在线证书状态协议(OCSP),Firefox 3默认情况下启用OCSP检查,从Vista和更高版本开始的Windows版本也是如此。

  • 1-1)证书的结构

X.509证书的结构是用ASN.1(Abstract Syntax Notation One:抽象语法标记)来描述其数据结构,并使用ASN1语法进行编码。

X.509 v3数字证书的结构如下:

●         Certificate 证书

● Version Number版本号

● Serial Number序列号

● ID Signature Algorithm ID签名算法

● Issuer Name颁发者名称

● Validity period 有效期 

● Not before起始日期

● Not after截至日期

● Subject Name主题名称

● Subject pbulic Key Info 主题公钥信息 

● Public Key Algorithm公钥算法

● Subject Public Key主题公钥

● Issuer Unique Identifier (optional)颁发者唯一标识符(可选)

● Subject Unique Identifier (optional)主题唯一标识符(可选)

● Extensions (optional) 证书的扩展项(可选)

● Certificate Sigature Algorithm证书签名算法

● Certificate Signature证书的签名

1-2)指示证书特定用法的扩展项

所有扩展都有自己ID,由object identifier来表达,它是一个集合,并且有一个标记用与指示这个扩展是不是决定性的。证书使用时,如果发现一份证书带有决定性标记的扩展,而这个系统并不清楚该扩展的用途,那么要拒绝使用它。但对于非决定性的扩展,不认识可以予以忽略。RFC 1422给出了v1的证书结构,ITU-T在v2里增加了颁发者和主题唯一标识符,从而可以在一段时间后重用。重用的一个例子是当一个CA破产了,它的名称也在公共列表里清除掉了,一段时间之后另一个CA可以用相同的名称来注册,即使它与之前的并没有任何瓜葛。不过IETF并不建议重用同名注册。另外v2也没有在Internet里大范围的使用。v3引入了扩展,CA使用扩展来发布一份特定使用目的的证书(比如说仅用于代码签名)。

对于所有的版本,同一个CA颁发的证书序列号都必须是唯一的。

RFC 5280(及后续版本)定义了数字证书扩展项,用于指示如何使用证书。它们大多来自joint-iso-ccitt(2)ds(5)id-ce(29)OID。第4.2.1节中定义的一些最常见的是:

       ● Basic Constraints,{id ce 19},用于指示是否是CA证书。

       ● Key Usage, {id ce 15},指定的加密操作,由证书中包含的公钥来执行;例如,它可以指示该密钥应用于签名,但不用于加密。

        ●Extended Key Usage{id ce 37},通常用于叶子证书,以指示证书中包含的公钥的用途。它包含一个OID列表,每个OID都表示允许使用。例如{id pkix 31}表示密钥可用于TLS或SSL连接的服务器端;{id pkix 34}表示密钥可以用于保护电子邮件。

通常情况下,一份证书有多个限制用途的扩展时,所有限制条件都应该满足才可以使用。RFC 5280里有对一个同时含有keyUsage和extendedKeyUsage的证书的例子,这样的证书只能用在两个扩展中都指定了的用途。比如网络安全服务决定证书用途时会同时对这两个扩展进行判断。

1-3)证书文件扩展名

X.509证书有几种常用的文件扩展名,但要注意:其中一些扩展也有其它用途,比如仅保存了私钥。

● .pem:(隐私增强型电子邮件),DER编码的证书再进行Base64编码,数据存放于“--- BEGIN CERTIFICATE ---”和“ --- END CERTIFICATE ---”之间

● .cer,.crt,.der:通常采用二进制DER形式,但Base64编码也很常见

● .p7b,.p7c-PKC#7:SignedData结构,没有数据,仅有证书或CRL

● .p12-PKCS#12:可以包含证书(公钥),也可同时包含受密码保护的私钥

● .pfx :PKCS#12的前身(通常包含PKCS#12格式的数据,如IIS中生成的PFX文件)

PKCS#7是签名或加密数据的格式标准,官方称之为容器。由于证书是可验真的签名数据,所以可以用SignedData结构表述。.P7C文件是退化的SignedData结构,没有包括签名的数据。

PKCS#12从个人信息交换(PFX)标准发展而来,用于在单个文件中交换公共和私有对象。



上一篇:failed to teardown pod "coredns-7ff77c879f-hkj5z_kube-system : x509: certificate signed by unkn


下一篇:小程序报错x509: certificate signed by unknown authority