数字证书

X.509数字证书

Posted by BY on July 26, 2018

对于非对称加密算法和数字签名来说,很重要的一点就是公钥的分发。理论上任何人可以公开获取到对方的公钥。然而这个公钥有没有可能是伪造的呢?传输过程中有没有可能被篡改掉呢?一旦公钥自身出了问题,则整个建立在其上的安全体系的安全性将不复存在。

数字证书机制正是为了解决这个问题,它就像日常生活中的一个证书一样,可以证明所记录信息的合法性。比如证明某个公钥是某个实体(如组织或个人)的,并且确保一旦内容被篡改能被探测出来,从而实现对用户公钥的安全分发。

根据所保护公钥的用途,可以分为加密数字证书(Encryption Certificate)和签名验证数字证书(Signature Certificate)。前者往往用于保护用于加密信息的公钥;后者则保护用于进行解密签名进行身份验证的公钥。两种类型的公钥也可以同时放在同一证书中。

一般情况下,证书需要由证书认证机构(Certification Authority,CA)来进行签发和背书。用户可以自行搭建本地CA系统,在私有网络中进行使用。

X.509证书规范

一般来说,一个数字证书内容可能包括基本数据(版本、序列号)、所签名对象信息(签名算法类型、签发者信息、有效期、被签发人、签发的公开密钥)、CA的数字签名,等等。

目前使用最广泛的标准为ITU和ISO联合制定的X.509的v3版本规范(RFC 5280),其中定义了如下证书信息域:

  • 版本号(Version Number):规范的版本号,目前为版本3,值为0x2;

  • 序列号(Serial Number):由CA维护的为它所颁发的每个证书分配的唯一的序列号,用来追踪和撤销证书。只要拥有签发者信息和序列号,就可以唯一标识一个证书,最大不能超过20个字节;

  • 签名算法(Signature Algorithm):数字签名所采用的算法,如sha256WithRSAEncryption或ecdsa-with-SHA256;

  • 颁发者(Issuer):颁发证书单位的标识信息,如“C=CN,ST=Beijing,L=Beijing,O=org.example.com,CN=ca.org.example.com”;

  • 有效期(Validity):证书的有效期限,包括起止时间;

  • 主体(Subject):证书拥有者的标识信息(Distinguished Name),如“C=CN,ST=Beijing,L=Beijing,CN=person.org.example.com”;

  • 主体的公钥信息(Subject Public Key Info):所保护的公钥相关的信息;

  • 公钥算法(Public Key Algorithm):公钥采用的算法;

  • 主体公钥(Subject Public Key):公钥的内容;

  • 颁发者唯一号(Issuer Unique Identifier):代表颁发者的唯一信息,仅2、3版本支持,可选;

  • 主体唯一号(Subject Unique Identifier):代表拥有证书实体的唯一信息,仅2、3版本支持,可选;

  • 扩展(Extensions,可选):可选的一些扩展。v3中可能包括:

    1. Subject Key Identifier:实体的密钥标识符,区分实体的多对密钥;
    2. Basic Constraints:一般指明是否属于CA;
    3. Authority Key Identifier:证书颁发者的公钥标识符;
    4. CRL Distribution Points:撤销文件的发布地址;
    5. Key Usage:证书的用途或功能信息。

证书格式

X.509规范中一般推荐使用PEM(Privacy Enhanced Mail)格式来存储证书相关的文件。证书文件的文件名后缀一般为.crt或.cer,对应私钥文件的文件名后缀一般为.key,证书请求文件的文件名后缀为.csr。有时候也统一用.pem作为文件名后缀。

PEM格式采用文本方式进行存储,一般包括首尾标记和内容块,内容块采用Base64进行编码。此外,还有DER(Distinguished Encoding Rules)格式,是采用二进制对证书进行保存,可以与PEM格式互相转换

证书信任链

证书中记录了大量信息,其中最重要的包括“签发的公开密钥”和“CA数字签名”两个信息。因此,只要使用CA的公钥再次对这个证书进行签名比对,就能证明某个实体的公钥是否是合法的。

实际上,要想知道CA的公钥是否合法,一方面可以通过更上层的CA颁发的证书来进行认证;另一方面某些根CA(Root CA)可以通过预先分发证书来实现信任基础。例如,主流操作系统和浏览器里面,往往会提前预置一些权威CA的证书(通过自身的私钥签名,系统承认这些是合法的证书)。之后所有基于这些CA认证过的中间层CA(Intermediate CA)和后继CA都会被验证合法。这样就从预先信任的根证书,经过中间层证书,到最底下的实体证书,构成一条完整的证书信任链。

某些时候用户在使用浏览器访问某些网站时,可能会被提示是否信任对方的证书。这说明该网站证书无法被当前系统中的证书信任链进行验证,需要进行额外检查。另外,当信任链上任一证书不可靠时,则依赖它的所有后继证书都将失去保障。