RSA-PSS 是什么
RSA-PSS 是 RFC 8017 §8.1 定义的概率签名方案。与 PKCS#1 v1.5 的确定性填充不同,它在生成签名时引入随机盐,因此同一份数据每次签名结果都不同,攻击者也无法通过比较签名判断消息内容,安全性有可证明的界。TLS 1.3 要求握手签名使用 PSS(如 rsa_pss_rsae_sha256),代码签名场景同样普遍推荐。
基本信息
| 标准 | RFC 8017 §8.1(RSASSA-PSS) |
|---|---|
| 盐长度 | 常用等于哈希输出长度,SHA-256 对应 32 字节 |
| TLS 1.3 签名 | rsa_pss_rsae_sha256、rsa_pss_pss_sha256 等 |
| 对比 v1.5 | 同长度下安全性论证更完整,且签名随机化 |
| 验签要求 | 双方盐长度策略必须一致 |
| 迁移现状 | 老客户端对 PSS 支持不完整,需按能力选择 |
典型使用场景
- 新增代码签名与内部 PKI:优先选择支持 PSS 的签名方案
- TLS 1.3 站点与客户端验证:握手签名要求支持 PSS
- 内部根与中间证书签发:用 PSS 为下级证书签名
- 兼容老客户端:对外接口保留 v1.5 验签能力并做能力普查
- 排查验签失败:先确认双方盐长度与摘要算法是否一致
签名与验签
签名与验签
# 签名:显式指定 PSS 填充与盐长度,不要依赖工具默认值
openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 -sign rsa.key -out sig.bin data.bin
# 验签:两侧参数必须完全一致
openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 -verify rsa.pub -signature sig.bin data.bin
# 查看证书实际使用的签名算法
openssl x509 -in cert.pem -noout -text | grep -i 'Signature Algorithm'PSS 与 v1.5 对照
| 维度 | RSA-PSS | PKCS#1 v1.5 |
|---|---|---|
| 填充方式 | 随机盐,签名不确定 | 确定性填充,同一消息签名相同 |
| 安全论证 | 有可证明的界 | 依赖更强的假设 |
| 新系统建议 | 优先使用 | 仅用于兼容老客户端 |
| TLS 1.3 | 握手签名要求支持 | 不用于握手签名 |
验签方必须使用相同的盐长度策略;多数库默认盐长度等于哈希长度,显式指定可以避免跨平台差异。
签名随机化是预期行为:同一份数据每次签名的输出都不同,因此不要用签名结果做去重、缓存键或相等性判断。
迁移顺序建议:新签发的证书与内部系统先上 PSS,对外接口保留 v1.5 验签能力,等客户端能力摸清后再收紧。