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
- Version(版本号)
- Serial Number(序列号)
- Algorithm ID(算法ID)
- Issuer(颁发者)
- Validity(有效期)
- Not Before(起始时间)
- Not After(终止时间)
- Subject(主题) 包括以下类容
- Name(CN, 公共名称)
- Name(O, 单位名称) Locality(L, 城市)
- (S, 省份)
- (C, 国家, 字母缩写)
- Subject Public Key Info(公钥信息)
- Public Key Algorithm(公钥算法)
- Public Key(公钥)
- Issuer Unique Identifier (Optional)(颁发者唯一ID, 可选)
- Subject Unique Identifier (Optional)(主题唯一ID, 可选)
- Extensions (Optional)(扩展,可选)
- Certificate Signature Algorithm(证书签名算法)
- 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证书将其加入系统证书库中。