1.公钥
1.1 本质
就是很大的数,有数字e, n, 看到的如下的一些.pem文件中的密钥,是数经过base64编码得到的字符串,便于文本传输
-----BEGIN RSA PRIVATE KEY-----
xxxxx......
-----END RSA PRIVATE KEY-----
1.2 作用
1.2.1 验证签名
验签过程是如下的数学运算:
e, n: 公钥的数 ,可以从base64编码后的字符串中解析出来
s: 签名,由私钥生成
pad(H(M)): 运算结果,是原始数据的哈希值
H: 哈希运算,常用sha256
M: 原始明文数据
pad: 表示填充
1.2.2 加密
也是数学运算:
2. 私钥
2.1 本质
也是很大的数,同公钥一样,但是有很多数,常用的这里有d, n。也是pem文件里面一堆字符串是base64编码所得,解析编码体可以解析出d, n 。这个跟公钥是一样的
2.2 作用
2.2.1 签名
含义同公钥
2.2.2 解密
含义同公钥
3. 密钥总结
| 项目 | RSA 加密 | RSA 签名 |
|---|---|---|
| 使用密钥 | 公钥 (e,n) 加密;私钥 (d,n) 解密 | 私钥 (d,n) 签名;公钥 (e,n) 验签 |
| 输入内容 | 原始短明文 M | 原文的哈希摘要(经过填充) |
| 目的 | 保密,不让第三方看到明文 | 证明数据是谁发的,有没有被篡改 |
| 能否反向推导 | 密文只能私钥解密 | 签名不能恢复原始原文,只能校验哈希 |
上述举例是RSA, 它的加密和签名底层的数学是用同一套 模幂运算,只是指数反过来;
总结:
私钥私有,公钥公开
私钥验名,公钥验签(处理的数据是明文哈希,经过填充)
私钥解密,公钥加密 (处理的是双端会话传输数据)
底层逻辑是数学运算
4. 证书
4.1 证书内容
以X.509为例,证书包含:
服务器公钥、域名、有效期、主体名称等(叫证书明文数据 T)
4.2 签名及验签
签发证书(服务器会将服务器公钥、证书等一起下发给客户端):
1. CA 计算Hash(T)→ 得到摘要(固定长度,比如 SHA256)
2. CA 用自己的私钥对这个哈希摘要做签名运算 → 得到数字签名 S
3. 把【明文 T + 签名 S】打包在一起 → 就是 X.509 证书
验签证书(客户端):
客户端拿到证书:明文 T + 签名 S
客户端本身持有CA根证书的公钥(如果是中间证书的公钥,可由服务器下发获取)
1. 客户端对明文 T 重新算一次哈希Hash(T)(证书中已经指定了使用的哈希算法,客户端使用该算法计算哈希)
2. 用CA 公钥验证签名 S,得到 CA 那边算出来的填充哈希,移除填充,得到原始哈希
3. 对比两个哈希:相等 = 验签通过,说明内容没篡改、确实是 CA 签的。
服务器提交信息 → 构造 tbsCertificate(待签名证书明文) ↓ CA计算 hash = SHA256(tbsCertificate) ↓ 对hash做填充 pad() ↓ sig = pad(hash)^d mod n # d,n来自CA的RSA私钥 ↓ 组装:tbsCertificate + 签名算法标识 + sig → 最终X.509证书4.3 证书吊销
证书是有有效期的,但还没到期就失效,就叫吊销。 场景举例:
- 服务器私钥泄露了,黑客拿到私钥,可以冒充服务器;证书虽然还没过期,但必须立刻作废。
- 域名转让、服务器下线,不再使用这个证书。
证书吊销 = CA 对外宣告:这份证书虽然时间没到,但不再可信,禁止使用
客户端 TLS 握手时,需要确认证书有没有被吊销。两种主流查询机制:
- CRL(证书吊销列表):CA 维护一个文件,里面列出所有被吊销证书的序列号;客户端下载整个列表,查证书序列号是否在里面。缺点:列表会越来越大。
- OCSP(在线证书状态协议):客户端联网,单独向 OCSP 服务器查询「这个证书序列号是否吊销」,只查单条记录,更常用。
⚠️ 注意: 有些环境会配置 OCSP stapling:服务器提前去 CA 查询自己证书状态,把 OCSP 响应一起发给客户端,客户端不用单独连外网 OCSP 服务器。
一句话:有效期是 “自然过期”;吊销是主动提前作废证书。
5. TLS流程
服务器【持有:服务器私钥 + 服务器证书】 ↓ 1.握手,下发证书 客户端 ←---- 服务器证书(服务器公钥+CA签名+信息) ↓ 2.客户端校验证书 ┌────────────────────────────────┐ │ 客户端本地根CA公钥,校验CA签名 │ │ 检查有效期、域名、吊销状态 │ └───────────┬────────────────────┘ ↓ 验证成功 信任证书内的服务器公钥 ↓ 客户端生成随机密钥,【服务器公钥加密】→发给服务器 ↓ 服务器用【服务器私钥】解密,拿到随机密钥 ↓ 两端生成相同对称会话密钥 ↓ 业务数据:对称加密传输注意点:
服务器下发给客户端的,除了证书本身的CA签名外,还有明文T数据,哈希算法标记等等,以及服务器的公钥,这个是服务器的,跟CA证书的密钥对不是一回事
CA证书的密钥对(签名验签): 证明证书可信
服务器的密钥对(加密解密): 用于证书可信后,服务器与客户端之间业务数据的对称加密传输
6. 证书链
6.1 证书链问题
上述说的例子前提是RSA, X.509,还有就是直接使用CA证书进行签名验签,实际上多数情况是有证书链的。如下:
根CA → 签发中间CA证书 → 中间CA签发网站服务器证书
TLS 握手时,服务器除了下发服务器叶子证书,一并把中间 CA 证书发给客户端。 客户端拿到中间证书,里面带有中间 CA 的公钥,用来验证叶子证书签名; 然后继续往上验签中间证书,直到找到本地内置的根证书完成整条链校验。
6.2 证书链场景TLS流程
1. 客户端收到服务器发来:服务器叶子证书 + 中间 CA 证书
2. 客户端用中间 CA 证书内的公钥,校验服务器证书签名
3. 客户端校验中间 CA 证书的签名,在本地系统证书库寻找根 CA 证书
4. 找到本地根证书,取出根 CA 公钥,校验中间 CA 证书签名
5. 整条链全部验签通过,再检查有效期、吊销状态、域名匹配
6.2 CA公钥来源
客户端的CA公钥怎么来的呢?(一般情况下预先内置在客户端本地系统 / 浏览器里)
获取 CA 公钥:本地预装/ 握手时服务器下发,不访问 CA 服务器
检查证书有没有吊销:联网访问 OCSP/CRL 服务器,查询证书状态
注意上述两种场景,CA公钥获取以及查看证书是否吊销不能混淆