1.PKI体系 1.1 PKI(Public Key Infrastructure,公钥基础架构)

PKI是一套以公钥技术为基础、提供安全服务的架构, 由认证机构(CA), 数字证书库, 密钥备份和恢复, 证书作废系统, 应用接口等组成。CA是PKI的核心,CA的主要功能有:证书发放、证书管理(更新、撤消、验证)。

几个基本概念:

  • 根证书:位于证书层次的最高层,所有证书链均终结于根证书。 >从属证书:由上一级认证机构颁发的证书。
  • 自签名证书:证书中的公钥和用于验证证书的密钥是相同的。自签名证书都是根证书。
  • 根CA:一种特殊的CA,受到无条件地信任,位于证书层次结构的最高层。根CA必须对自己的证书签名,因为在证书层次结构中不存在更高的认证机构。常见根CA有:VeriSign, GlobalSign, Thawte, GeoTrust等。
  • 从属CA:拥有上一级CA的CA。从属CA的证书中公钥和用于验证证书的密钥是不相同的。
  • CA/证书的层级结构:PKI架构中,从根CA开始,CA体系表现为自上而下的层次结构。下级CA信任上一级CA;下级CA由上一级CA颁发证书并认证。
  • 公钥(Public Key):不对称密钥加密体系中,可以提供给他人使用的密钥。一般包含在证书中。
  • 私钥(Private Key):不对称密钥加密体系中,仅供自己使用的密钥。
  • 证书撤消列表(Certificate Revocation List, CRL):CRL给出了证书颁发者认定为无效的证书的序列号列表。

1.2 X.509标准

X.509标准是ITU-T为PKI所设计的一套标准。X.509标准定义了公钥证书(public key certificate), 证书撤消列表(certificate revocation list), 属性证书(attributes certificat), 和证书路径验证算法的标准。

通常,X.509证书包含以下信息:


Certificate


  1. Version(版本号)
  2. Serial Number(序列号)
  3. Algorithm ID(算法ID)
  4. Issuer(颁发者)
  1. Validity(有效期)
  2. Not Before(起始时间)
  3. Not After(终止时间)
  4. Subject(主题) 包括以下类容 
  5. Name(CN, 公共名称) 
  6. Name(O, 单位名称) Locality(L, 城市) 
  7. (S, 省份) 
  8. (C, 国家, 字母缩写)
  9. Subject Public Key Info(公钥信息)
  10. Public Key Algorithm(公钥算法)
  11. Public Key(公钥)
  1. Issuer Unique Identifier (Optional)(颁发者唯一ID, 可选)
  2. Subject Unique Identifier (Optional)(主题唯一ID, 可选)
  3. Extensions (Optional)(扩展,可选)
  4. Certificate Signature Algorithm(证书签名算法)
  5. Certificate Signature(证书签名)






1.3 PKCS(Public-key cryptography standards)


RSA数据安全公司发布的一组公钥加密系统标准, 主要涉及证书申请,更新,撤消列表发布,数字签名,数字封装等方面。

到目前为止,PKCS标准共有15个

PKCS已发布的标准有:

  • PKCS#1 : RSA Cryptography Stand. RSA密码编译标准.RSA公钥和私钥数学特性和格式,以及执行RSA加密/解密,签名生成和验证的基本算法.
  • PKCS#2 : RSA消息摘要加密. 已撤消, 合并入PKCS#1
  • PKCS#3 : Diffie-Hellman Key Agreenment Standard. D-H密钥交换协议, 通信双方在不安全通信信道中协商公用安全密钥的协议.
  • PKCS#4 : RSA密钥语法. 已撤消,合并入PKCS#1
  • PKCS#5 : Password-based Encryption Standard. 使用基于密码的密钥加密字符串的方法.
  • PKCS#6 : Extended-Certificate Syntax Standard. 扩展证书语法标准. 旧的X.509 v1版本证书扩展规范. X.509 v3废弃.
  • PKCS#7 : Cryptographic Message Syntax Standard. 加密消息语法标准. 用于公钥交换(PKI)方式下如何对消息进行加密或签名;也可用于证书分发.
  • PKCS#8 : Private-Key Information Syntax Standard. 私钥信息语法标准. 如何描述私钥信息.
  • PKCS#9 : Selected Attribute Types. 一些被选作用于PKCS#6证书扩展, PKCS#7数字签名消息, PKCS#8私钥信息,PKCS#10证书签名请求的属性.
  • PKCS#10: Certification Request Standard. 证书请求标准. 发送至CA的证书请求的消息格式.
  • PKCS#11: 加密系统通用应用程序接口,Cryptoki
  • PKCS#12: 个人信息交换语法标准. 用于存储使用了密码保护的私钥及相应公钥证书的文件格式. PFX为PKCS#12的前身.
  • PKCS#13: Elliptic Curve Cryptography Standard. 椭圆曲线加密体系标准. 基于有限域椭圆曲线代数结构的公钥加密体系. 开发中.
  • PKCS#14: Pseudo-random Number Generation. 伪随机数生成标准. 开发中
  • PKCS#15: Cryptographic Token Information Format Standard. 加密令牌信息格式标准. 允许加密令牌用户可以以与应用Cryptoki无关方式向应用标识自己身份.

1.4 PEM(Privacy-enhanced Electronic Mail),增加隐私电子邮件标准

PEM是早期IETF建议的一套使用公钥加密体系的安全电子邮件标准. 由于各种原因未能大规模应用。不过,PEM标准中基于Base64编码的X.509证书成为了CA证书的通用格式之一。

PEM文件以"-----BEGIN CERTIFICATE-----"标识开始,以"-----END CERTIFICATE-----"标识终结。支持在同一文件中描述多个证书。

PKCS & X.509 & PEM

简单地说,PKCS和X.509是不同组织/公司所发布的针对PKI内不同领域的两个/套标准。PKCS系列标准中所涉及到的证书部分均遵守X.509标准。

X.509标准所考虑的核心问题是(公钥)证书的格式/内容,如何检验证书的有效性,以及证书撤消列表等。

PKCS系列标准所关注的则是整个公钥加密体系。在PKCS发布的一系列标准中,有些与证书无关(因此也就与X.509无直接关系),如下面列出的 PKCS#1 RSA密码编译标准;有些则与X.509有直接关系,如PKCS#6是在X.509证书最初v1版本基础上的扩展,随着X.509证书版本升级到 v3,PKCS#6则被废弃;再如PKCS#12个人信息交换语义标准,定义了包含公钥证书和个人私钥的个人信息文件的格式,其中的公钥证书部分则完全遵守X.509证书格式。

PEM格式证书指采用了采用Base64编码的X.509证书(除X.509标准证书内容外,PEM中还可以将个人私钥等对象存储进来)。


1.5 两种编码规范

同样内容的证书,可以采用不同的编码方式。

DER(Distinguished Encoding Rules):ITU-T X.690中规定的一套将任意类型数据编码为二进制格式的规范,可认为是BER(Basic Encoding Rules)子集之一。

Base64编码:将二进制数据每6比特一组转换为64个可打印ASCII字符之一的一种3B4B编码方式。最初用来对电子邮件进行编码,后也被应用于其他领域。


2 常见证书格式

常见证书相关文件名后缀

  • .csr :X.509证书请求文件(Certificate Signing Request)。CA签名后生成.crt证书文件
  • .cer, .crt, .der : DER二进制编码的X.509证书,不包含私钥
  • .pem : PEM Based64编码的DER证书(或证书链,可包含私钥)
  • .p7b, .p7c : PKCS#7标准证书(或证书链,不包含私钥). Win平台下常被用来存储证书链. 证书存放在"-----BEGIN PKCS7-----"和"-----END PKCS7-----"之间.
  • .p7r : PKCS#7证书请求
  • .p10:PKCS#10证书签名请求文件。CA签名后以p7r文件回复。
  • .p12 : PKCS#12标准证书. 通常包含证书, 公钥, 以及使用了密码保护的私钥
  • .pfx : PKCS#12格式的前身. 通常包含有PKCS#12格式的数据. Win平台下常用作导入/导出证书及私钥.
  • .pvk : 微软用于存放私钥的文件格式
  • .spc(Software Publishing Certificate) : 微软软件发布证书,用于给软件进行签名。
  • .key : Base64编码私钥文件,可以使用或不使用密码保。

3. 证书申请/发放/自签名

普通用户如需要申请证书,则以一定的格式(如csr/p7r等)向某一级CA提供证书所需信息(用户名/联系方式/证书用途等等)提出证书申请请求,CA审核通过后将用户信息/证书用途/颁发时间/有效期/证书序号/用户公钥/签名算法等等信息填入证书,并使用自己的私钥对以上信息进行签名,最终将证书和用户私钥颁发给用户。对于证书被颁发者或者第三人,可以使用CA的公钥来验证证书的有效性。

PKI体系中,CA是分层的,下一级CA的证书由上一级CA颁发;用户/系统/应用如果信任某一个CA,则信任此CA颁发的下一级证书。换句话说,某一个证书,如果用户信任证书库中存在着一条从某个根CA到此证书的完整证书链,则此证书受信;否则不被信任。

对于根CA,由于不存在级别比自己还高的CA,所以根CA的证书是由自己签发的,也即,根CA使用了自己的私钥对自己的证书进行的签名(而普通用户的证书是由证书颁发CA的私钥进行签名的),这就是自签名证书。一般操作系统都已经预置了一些可信根CA证书(如VeriSign等),用户也可以选择自行安装其他根CA证书将其加入系统证书库中。