EMSA-PSS(RFC 8017 §9.1)把 M' = 0x00×8 ‖ mHash ‖ salt 哈希为 H,构造 DB = PS ‖ 0x01 ‖ salt,用 MGF1(H) 对其掩码,并输出 maskedDB ‖ H ‖ 0xbc,随后像普通 RSA 签名一样做模幂运算。参数包括哈希、掩码生成函数(MGF1 及其自身使用的哈希)、盐长度和尾部字段,签名者和验证者必须在所有这些参数上保持一致。
盐长度是最典型的互操作故障来源。JOSE 的 PS256/PS384/PS512 把 MGF1 固定为同一哈希,并把盐长度固定为哈希长度(RFC 7518 §3.5);FIPS 186-5 §5.4(g) 要求 0 ≤ sLen ≤ hLen。OpenSSL 1.1.1 和 3.0 默认使用最大盐长度签名(RSA-2048 配合 SHA-256 时为 222 字节),而 OpenSSL 3.1 及更高版本默认使用 auto-digestmax,实际上等于摘要长度;固定了其他长度的验证者会拒绝该签名,并报错 salt length check failed。
只要用 RSA 对握手数据签名,TLS 1.3 就要求使用 PSS:rsa_pss_rsae_sha256(0x0804)使用普通的 rsaEncryption 密钥,rsa_pss_pss_sha256(0x0809)则使用由 id-RSASSA-PSS OID 1.2.840.113549.1.1.10(RFC 4055)限定只能用于 PSS 的密钥。PKCS #1 v1.5 只在证书签名中保留了下来。密钥与 PKCS #1 v1.5 通用:把 RS256 部署切换到 PS256 不需要新密钥,只需要验证者接受 PSS。