2、密码学基础回顾:对称加密与非对称加密、哈希算法与数字签名、公钥基础设施(PKI)概念、X.509标准介绍
说实话,很多做客户端证书开发的朋友,一开始都栽在密码学基础上。不是代码写不出来,而是搞不懂「为什么要这么设计」。我当年刚接触证书时也踩过这个坑——证书链验证失败,查了三天,最后发现是对非对称加密的理解有偏差。
这一节,咱们把密码学里跟证书最相关的几个概念捋清楚。不扯太深的理论,重点讲「它们跟客户端证书到底有什么关系」。
2.1 对称加密与非对称加密
这两种加密方式,是证书体系的基石。你想想看,如果客户端和服务器要安全通信,总得有个办法让双方都能看懂对方发的消息,但又不能让第三方看懂。
2.1.1 对称加密
对称加密,说白了就是「一把钥匙开一把锁」。加密和解密用同一个密钥。
- 优点:速度快,适合加密大量数据
- 缺点:密钥怎么安全地传给对方?这是个死循环
- 常见算法:AES、DES、3DES、SM4(国密)
核心要点:对称加密本身不解决「密钥分发」问题。客户端证书场景中,对称密钥通常是通过非对称加密来安全传输的。
2.1.2 非对称加密
非对称加密就巧妙多了——它有一对密钥:公钥和私钥。公钥可以公开,私钥必须保密。
- 公钥加密,私钥解密:别人用你的公钥加密数据,只有你能用私钥解开
- 私钥签名,公钥验签:你用私钥签名一段数据,别人用你的公钥验证签名是否是你本人所为
- 常见算法:RSA、ECDSA、SM2(国密)
我的经验:我在项目中遇到过有人把RSA密钥对搞混——用私钥加密数据,然后问为什么公钥解不开。记住:RSA的加密只能用公钥,解密只能用私钥。签名则反过来。
2.1.3 两者对比
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1个 | 2个(公钥+私钥) |
| 密钥分发 | 困难 | 公钥可公开 |
| 加密速度 | 快(硬件加速) | 慢(比对称慢100-1000倍) |
| 典型用途 | 数据加密传输 | 密钥交换、数字签名 |
| 证书场景 | TLS会话加密 | 证书签名、身份认证 |
2.2 哈希算法与数字签名
哈希算法,很多人叫它「散列函数」。它的作用很简单:把任意长度的数据,压缩成固定长度的「指纹」。
2.2.1 哈希算法的特性
- 单向性:从哈希值无法反推出原始数据
- 抗碰撞性:很难找到两个不同数据有相同的哈希值
- 固定输出长度:SHA-256输出256位,不管输入是1字节还是1GB
- 常见算法:SHA-256、SHA-3、SM3(国密)
注意:MD5和SHA-1已经被证明不安全,不要再用了。我曾经审计过一个老系统,还在用MD5做证书指纹校验——这等于没锁门。
2.2.2 数字签名的工作原理
数字签名,就是把哈希算法和非对称加密结合起来。流程是这样的:
- 对原始数据计算哈希值
- 用私钥对哈希值加密(这就是签名)
- 把签名和原始数据一起发给对方
- 对方用公钥解密签名,得到哈希值
- 对方再对原始数据计算哈希值
- 两个哈希值对比——一致则签名有效
为什么先哈希再签名? 因为非对称加密很慢。如果直接加密整个文件,性能会崩溃。先哈希成固定长度的摘要,再签名,效率高得多。证书签名就是这么干的。
2.3 公钥基础设施(PKI)概念
PKI不是某个具体技术,而是一套完整的体系。它解决的核心问题是:你怎么知道某个公钥确实属于某个人?
我刚开始做证书时,觉得PKI很虚。后来在项目中搭建企业CA时才发现,PKI的每个组件都是必要的。
2.3.1 PKI的核心组件
| 组件 | 作用 | 客户端证书中的角色 |
|---|---|---|
| CA(证书颁发机构) | 签发和吊销证书 | 客户端证书的签发者 |
| RA(注册机构) | 审核申请者身份 | 验证客户端身份真实性 |
| 证书库 | 存储和分发证书 | 客户端下载证书的地方 |
| CRL/OCSP | 证书吊销状态查询 | 验证客户端证书是否有效 |
| 终端实体 | 证书的实际使用者 | 持有客户端证书的用户或设备 |
2.3.2 信任链模型
PKI采用树形信任模型。根CA自签名,然后签发下级CA,下级CA再签发终端证书。客户端验证证书时,会沿着这条链一直追溯到根CA。
避坑指南:我曾经遇到一个案例,客户端证书验证失败,原因是中间CA证书没有安装在服务器信任库中。记住:验证证书链时,除了根CA,中间CA证书也必须可获取。
2.4 X.509标准介绍
X.509是证书的「格式标准」。所有客户端证书,不管是谁签发的,都遵循这个标准。它定义了证书里该有哪些字段、字段怎么编码。
2.4.1 证书结构
一个X.509 v3证书包含以下关键字段:
| 字段 | 说明 | 示例值 |
|---|---|---|
| 版本号 | 目前主流是v3 | 2(表示v3) |
| 序列号 | CA分配的唯一编号 | 0x1A2B3C4D |
| 签名算法 | CA签名用的算法 | sha256WithRSAEncryption |
| 颁发者 | 签发该证书的CA名称 | CN=MyCA, O=Example Inc |
| 有效期 | 起止时间 | 2024-01-01 ~ 2025-01-01 |
| 主体 | 证书持有者名称 | CN=client.example.com |
| 公钥 | 持有者的公钥 | RSA 2048位公钥 |
| 扩展项 | v3新增的扩展功能 | 密钥用法、增强型密钥用法 |
| 签名值 | CA对上述字段的签名 | 256字节的RSA签名 |
2.4.2 关键扩展项
X.509 v3扩展项,是客户端证书的核心配置。我建议重点关注这几个:
- 密钥用法(Key Usage):digitalSignature、keyEncipherment等
- 增强型密钥用法(Extended Key Usage):clientAuth(客户端认证)、serverAuth(服务器认证)
- 主体备用名称(Subject Alternative Name):DNS名称、IP地址、电子邮件
- 基本约束(Basic Constraints):是否为CA证书
重要:客户端证书必须包含 clientAuth 这个增强型密钥用法。我见过有人把服务器证书的配置直接套用到客户端证书上,结果TLS握手时客户端认证失败——就是因为EKU里写的是serverAuth而不是clientAuth。
2.5 知识体系总览
下面这张图,把本章的核心概念串起来了。你可以看到,从密码学基础到X.509证书,是一条清晰的逻辑链。
2.6 小结
这一节的内容,是后续所有章节的基础。你不需要背下所有算法细节,但一定要理解:
- 对称加密负责「快」,非对称加密负责「安全分发密钥」
- 哈希算法保证数据完整性,数字签名保证身份真实性
- PKI解决了「公钥属于谁」这个信任问题
- X.509是证书的通用格式,客户端证书必须遵循这个标准
我的建议:学完这一节,你可以用OpenSSL命令实际查看一个证书的各个字段。纸上得来终觉浅,亲手解析一个证书,比看十遍理论都管用。