本文主要简述数字证书和密钥相关的一些基础知识,例如什么是数字证书?ASN.1 是什么?常见的 X.509 代表什么含义?什么是 PKI、PKCS 标准?
对于非对称加密算法和数字签名来说,很重要的步骤就是公钥的分发。理论上任何人都可以获取到公开的公钥,然而这个公钥文件有可能是伪造的,传输过程中也有可能被篡改,所以一旦公钥自身出了问题,则整个建立在其上的的安全性将不复成立。
数字证书机制 正是可以解决公钥分发问题,确保所记录信息的合法性。比如证明某个公钥是某个实体(个人或组织)拥有,并且确保任何篡改都能被检测出来,从而实现对用户公钥的安全分发。
根据所保护公钥的用途,数字证书可以分为 加密数字证书(Encryption Certificate) 和 签名验证数字证书(Signature Certificate)。
一般情况下,证书需要由 证书认证机构(Certification Authority,CA) 来进行签发和背书。
常见的 数字证书 和 密钥 都采用了 ASN.1 格式的语法来描述结构,ASN.1(Abstract Syntax Notation One) 是一套标准,是描述数据的表示、编码、传输、解码的数据格式。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。
ASN.1 本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。各种 ASN.1 编码规则提供了由 ASN.1 描述其抽象句法的数据的值的传送语法(具体表达)。ASN.1 的标准编码规则有:
<Type, Length, Value>
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),其中定义了如下证书信息域:
0x2
)C=CN, ST=Shanghai, L=Shanghai, O=org.aurthur.cn, CN=ca.org.aurthur.aurthur
Not Before 2020-08-08-00-00UTC,Not After 20230-08-08-00-00UTC
C=CN, ST=Shanghai, L=Shanghai, CN=p1.org.aurthur.cn
X.509 标准图解:
按照 X.509 规范,公钥可以通过证书机制来进行保护,但证书的生成、分发、撤销等步骤并未涉及。
PKI(Public Key Infrastructure)体系 解决了证书生命周期相关的认证和管理问题,定义了安全地管理、分发证书需要遵循的标准。
PKI 是建立在公私钥基础上实现安全可靠传递消息和身份确认的一个通用框架,并不代表某个特定的密码学技术和流程,实现了 PKI 规范的平台可以安全可靠地管理网络中用户的密钥和证书。
一个完备 PKI 体系应该包括如下组件:
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) | 定义了密码设备内部数据的组织结构 |