TLS1.3证书验证完整算法

问题描述 投票:0回答:1

我想实现 TLS1.3 证书验证功能(无需外部库、openssl 等)。

我对文档有点困惑。据我相信,使用 RSA-PSS-RSAE-SHA256 的算法如下:

  1. 解析和检查证书握手中收到的证书是可以的。从这里我还可以获得用于证书验证的公钥(RSA n 和 e)

  2. 根据RFC8446/4.4.3,要签名的内容包括:64 * 0x20 +“TLS 1.3,服务器证书验证”+ 0x00 + 消息的转录哈希(在我们的例子中,连接所有握手的 sha256 哈希 ClientHello ...证书)。我认为内容是以下消息

    M

  3. RSASSA-PPSEMSA-PSS(针对所选签名算法)在 RFC8017/8.1.2, 9.1.2 中进行了描述。主要有两个步骤: 签名必须经过 RSA 解密(8.1.2);必须进行EMSA-PSS验证(9.1.2):

    1. 第一个相当简单,导致编码消息
      EM
    2. 哈希 (
      H
      ) 和
      salt
      可以从中提取。详情请参阅 RFC 文档
    3. 必须计算M的哈希值:
      mHash = sha256(M)
    4. H'
      可以通过
      (8 * 0x00 + mHash + salt)
    5. 的sha256哈希计算
  4. 如果

    H == H'
    ,则验证成功。

至少我是这么解释的。但它不起作用:

  1. 我几乎可以肯定,我的成绩单哈希值是好的,我在 TLS 通信中的多个位置成功使用了握手连接,并且计算它的哈希值也没什么大不了的
  2. 所以我几乎可以肯定,内容(在内容哈希前面加上上面看到的元素)也是可以的。
  3. RFC8446 和 RFC8017 之间可能存在差距,但我没有找到任何相关信息。也许RSASSA-PPS的
    M
    与TLS证书验证内容不一样。
  4. 我可以使用签名和公钥评估
    H
    salt
    (对此有很好的检查机会,所以在我的情况下这肯定没问题)

但结果

H != H'

所以我可能误解了这个算法的某些内容。也许消息

M
应该有所不同,或者缺少其他内容。有没有什么好的描述可以逐步引导这个过程?或者可以部分运行的源代码,以便我可以检查我的实现在哪里出现偏差? (Pyhton 或 Perl 是首选,但任何主要语言都可以)

algorithm ssl certificate tls1.3 x509certificatevalidator
1个回答
0
投票

我认为问题在于您使用公钥而不是私钥。 签名是使用与证书内的公钥配对的私钥创建的。

© www.soinside.com 2019 - 2024. All rights reserved.