密码学基础(二)数字证书、密钥基础知识
本文主要简述数字证书和密钥相关的一些基础知识,例如什么是数字证书?ASN.1 是什么?常见的 X.509 代表什么含义?什么是 PKI、PKCS 标准?
一、数字证书
对于非对称加密算法和数字签名来说,很重要的步骤就是公钥的分发。理论上任何人都可以获取到公开的公钥,然而这个公钥文件有可能是伪造的,传输过程中也有可能被篡改,所以一旦公钥自身出了问题,则整个建立在其上的的安全性将不复成立。
数字证书机制 正是可以解决公钥分发问题,确保所记录信息的合法性。比如证明某个公钥是某个实体(个人或组织)拥有,并且确保任何篡改都能被检测出来,从而实现对用户公钥的安全分发。
根据所保护公钥的用途,数字证书可以分为 加密数字证书(Encryption Certificate) 和 签名验证数字证书(Signature Certificate)。
- 加密数字证书 用来保护加密用途的公钥
- 签名验证数字证书 用来保护签名用途的公钥
- 两种类型的公钥可以同时放在同一证书中
一般情况下,证书需要由 证书认证机构(Certification Authority,CA) 来进行签发和背书。
- 权威的商业证书认证机构包括 DigiCert、GlobalSign、VeriSign 等
- 用户也可以自行搭建本地 CA 系统,在私有网络中进行自有证书的签发和背书
二、ASN.1
常见的 数字证书 和 密钥 都采用了 ASN.1 格式的语法来描述结构,ASN.1(Abstract Syntax Notation One) 是一套标准,是描述数据的表示、编码、传输、解码的数据格式。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。
ASN.1 本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。各种 ASN.1 编码规则提供了由 ASN.1 描述其抽象句法的数据的值的传送语法(具体表达)。ASN.1 的标准编码规则有:
- BER 基本编码规则(Basic Encoding Rules)
- BER(BasicEncoding Rules)是 ASN.1 中最早定义的编码规则,其他编码规则是在 BER 的基础上添加新的规则构成
- BER 的语法传输格式是 TLV 三元组
<Type, Length, Value>
- DER 唯一编码规则(Distinguished Encoding Rules)
- CER 规范编码规则(Canonical Encoding Rules)
- PER 压缩编码规则(Packed Encoding Rules)
- XER XML 编码规则(XML Encoding Rules)
三、X.509 证书规范
X.509 是密码学里公钥证书的格式标准。
一个数字证书内容可能包括证书域(证书的版本、序列号、签名算法类型、签发者信息、有效期、被签发主体、签发的公开密钥)、CA 对证书的签名算法和签名值等,他们一般就采用 X.509 规范编写。
证书格式:X.509 规范中一般推荐使用 PEM(Privacy Enhanced Mail)格式来存储证书相关的文件。
- 证书文件的文件名后缀一般为
.crt
或.cer
- 对应私钥文件的文件名后缀一般为
.key
- 证书请求文件的文件名后缀为
.csr
- 有时候也统一用
.pem
作为文件名后缀
PEM 格式 采用文本方式进行存储,一般包括首尾标记和内容块,内容块采用 Base64 格式编码,示例如下:
-----BEGIN CERTIFICATE-----
BASE64 CONTENT
-----END CERTIFICATE-----
目前使用最广泛的标准为 ITU 和 ISO 联合制定的 X.509 的 v3 版本规范(RFC 5280),其中定义了如下证书信息域:
- 版本号(Version Number):规范的版本号(目前为版本 3,值为
0x2
) - 序列号(Serial Number):由 CA 维护的为它所颁发的每个证书分配的唯一的序列号,用来追踪和撤销证书
- 签名算法(Signature Algorithm ID):签名所采用的算法
- 颁发者(Issuer Name):颁发证书单位的信息,如
C=CN, ST=Shanghai, L=Shanghai, O=org.aurthur.cn, CN=ca.org.aurthur.aurthur
- 有效期(Period of validity):证书的有效期限,如
Not Before 2020-08-08-00-00UTC,Not After 20230-08-08-00-00UTC
- 被签发主体(Subject Name):证书拥有者的标识信息(Distinguished Name),如
C=CN, ST=Shanghai, L=Shanghai, CN=p1.org.aurthur.cn
- 主体的公钥信息(Subject Public Key Info):所保护的公钥相关的信息
- 公钥算法(Public Key Algorithm):公钥采用的算法
- 主体公钥(Subject Public Key):公钥的内容
- 颁发者唯一号(Issuer Unique Identifier,可选):代表颁发者的唯一信息,仅 2、3 版本支持(可选)
- 主体唯一号(Subject Unique Identifier,可选):代表拥有证书实体的唯一信息,仅 2、3 版本支持(可选)
- 扩展(Extensions,可选):可选的一些扩展,可能包括:
- Subject Key Identifier:实体的密钥标识符,区分实体的多对密钥
- Basic Constraints:一般指明该证书是否属于某个 CA
- Authority Key Identifier:颁发这个证书的颁发者的公钥标识符
- Authority Information Access:颁发相关的服务地址,如颁发者证书获取地址和吊销证书列表信息查询地址
- CRL Distribution Points:证书注销列表的发布地址
- Key Usage: 表明证书的用途或功能信息,如 Digital Signature、Key CertSign
- Subject Alternative Name:证书身份实体的别名
- 证书签名算法(Certificate Signature Algorithm):证书签名所用的算法
- 证书签名(Certificate Signature):证书的签名
X.509 标准图解:
四、PKI 体系
按照 X.509 规范,公钥可以通过证书机制来进行保护,但证书的生成、分发、撤销等步骤并未涉及。
PKI(Public Key Infrastructure)体系 解决了证书生命周期相关的认证和管理问题,定义了安全地管理、分发证书需要遵循的标准。
PKI 是建立在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架,并不代表某个特定的密码学技术和流程,实现了 PKI 规范的平台可以安全可靠地管理网络中用户的密钥和证书。
一个完备 PKI 体系应该包括如下组件:
- 数字证书:包含了用于签名和加密数据的公钥的电子凭证,是 PKI 的核心元素
- 认证中心(CA):数字证书的申请及签发机关,CA 必须具备权威性
- 证书资料库:存储已签发的数字证书和公钥,以及相关证书目录,用户可由此获得所需的其他用户的证书及公钥
- 证书吊销列表(CRL)/OCSP:在有效期内吊销的证书列表,OCSP(在线证书状态协议)是获得证书状态的国际协议
- 密钥备份及恢复:为避免因用户丢失解密密钥而无法解密合法数据的情况,PKI 应提供备份与恢复密钥的机制
- PKI 应用接口(API):为应用提供安全、一致、 可信的方式与 PKI 交互
五、PKCS 标准
PKCS 全称是 Public-Key Cryptography Standards(公钥加密标准),是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 15 个标准。
我们现在所常用的 RSA 密码算法就是 PKCS#1
标准实现的算法,一般使用 1.5 版本的。
名称 | 版本 | 用途 | 说明 |
---|---|---|---|
PKCS#1 | 2.1 | RSA 密码编译标准(RSA Cryptography Standard) | 定义了 RSA 的数理基础、公(私)钥格式,以及加(解)密、签(验)章的流程(1.5 版本曾经遭到攻击) |
PKCS#2 | - | 撤销 | 原本是用以规范 RSA 加密摘要的转换方式(现已被纳入 PKCS#1 之中) |
PKCS#3 | 1.4 | DH 密钥协议标准(Diffie-Hellman key agreement Standard) | 规范以 DH 密钥协议为基础的密钥协议标准 |
PKCS#4 | - | 撤销 | 原本用以规范转换 RSA 密钥的流程(现已被纳入 PKCS#1 之中) |
PKCS#5 | 2.0 | 密码基植加密标准(Password-based Encryption Standard) | 参见 RFC 2898 与 PBKDF2 |
PKCS#6 | 1.5 | 证书扩展语法标准(Extended-Certificate Syntax Standard) | 将原本 X.509 的证书格式标准加以扩充 |
PKCS#7 | 1.5 | 密码消息语法标准(Cryptographic Message Syntax Standard) | 参见 RFC 2315,规范了以公开密钥基础设施(PKI)所产生之签名(密文)之格式 |
PKCS#8 | 1.2 | 私钥消息表示标准(Private-Key Information Syntax Standard) | Apache 读取证书私钥的标准 |
PKCS#9 | 2.0 | 选择属性格式(Selected Attribute Types) | 定义 PKCS#6、PKCS#7、PKCS#8、PKCS#10 的选择属性格式 |
PKCS#10 | 1.7 | 证书申请标准(Certification Request Standard) | 参见 RFC 2986,规范了向证书中心申请证书之 CSR 的格式 |
PKCS#11 | 2.20 | 密码设备标准接口(Cryptographic Token Interface (Cryptoki)) | 定义了密码设备的应用程序接口(API)规范 |
PKCS#12 | 1.0 | 个人消息交换标准(Personal Information Exchange Syntax Standard) | 定义了包含私钥与公钥证书(Public Key Certificate)的文件格式(常见的 PFX 就履行了 PKCS#12) |
PKCS#13 | – | 椭圆曲线密码学标准(Elliptic curve cryptography Standard) | 规范以椭圆曲线密码学为基础所发展之密码技术应用(制定中) |
PKCS#14 | – | 拟随机数产生器标准(Pseudo-random Number Generation) | 规范拟随机数产生器的使用与设计(制定中) |
PKCS#15 | 1.1 | 密码设备消息格式标准(Cryptographic Token Information Format Standard) | 定义了密码设备内部数据的组织结构 |