我想实现 TLS1.3 证书验证功能(无需外部库、openssl 等)。
我对文档有点困惑。据我相信,使用 RSA-PSS-RSAE-SHA256 的算法如下:
解析和检查证书握手中收到的证书是可以的。从这里我还可以获得用于证书验证的公钥(RSA n 和 e)
根据RFC8446/4.4.3,要签名的内容包括:64 * 0x20 +“TLS 1.3,服务器证书验证”+ 0x00 + 消息的转录哈希(在我们的例子中,连接所有握手的 sha256 哈希 ClientHello ...证书)。我认为内容是以下消息
M
。
RSASSA-PPS 和 EMSA-PSS(针对所选签名算法)在 RFC8017/8.1.2, 9.1.2 中进行了描述。主要有两个步骤: 签名必须经过 RSA 解密(8.1.2);必须进行EMSA-PSS验证(9.1.2):
EM
H
) 和 salt
可以从中提取。详情请参阅 RFC 文档mHash = sha256(M)
H'
可以通过(8 * 0x00 + mHash + salt)
如果
H == H'
,则验证成功。
至少我是这么解释的。但它不起作用:
M
与TLS证书验证内容不一样。H
和salt
(对此有很好的检查机会,所以在我的情况下这肯定没问题)但结果
H != H'
。
所以我可能误解了这个算法的某些内容。也许消息
M
应该有所不同,或者缺少其他内容。有没有什么好的描述可以逐步引导这个过程?或者可以部分运行的源代码,以便我可以检查我的实现在哪里出现偏差? (Pyhton 或 Perl 是首选,但任何主要语言都可以)
我认为问题在于您使用公钥而不是私钥。 签名是使用与证书内的公钥配对的私钥创建的。