我如何使用mbedtls进行验证,即证书可以验证密钥?

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

Mbedtls可以通过其mbedtls_x509_crt_verify(...)功能(link)验证x509证书。

但是,我有:

  • 公/私钥对(保存在mbedtls_pk_context中。]
  • 我从其他来源获得的证书(因此,不能保证它不包含任何可能的智能修改)。

证书的验证没有问题。

但是,如果该证书验证了不同的密钥怎么办?(软件问题和破解尝试的结果是什么。)当然,这样的密钥/证书对将无法进行tls握手。 ,但我认为不需要为此建立tcp连接。

[This source(尽管它适用于openssl脚本),很可能仅通过模数匹配就可以进行证书密钥匹配验证。

[还有一个mbedtls_pk_verify(...)函数(ref),但在我看来,它主要使用签名来播放。但是我没有签名,我有证书(pem格式的证书)和我的密钥(我也有pem格式的密钥)。将它们处理为内部mbedtls数据结构(mbedtls_x509_crtmbedtls_pk_context)不是问题,但是如何验证它们是否匹配?

ssl tls1.2 mbedtls
1个回答
0
投票

正如this security.SE的回答所说,如果证书和私钥文件中的公钥相同,则验证就足够了。这是因为它是其中唯一的共享信息。

因此,我们需要从mbedtls_pk_contentmbedtls_x509_cert中找出公钥并进行比较。

mbedtls对此任务没有通用的API调用,但是可以通过特定于算法的解决方案来完成。步骤如下。假设我们有

mbedtls_x509_cert crt;
mbedtls_pk_context pk;

crt有证书,pk是我们的公钥-私钥对。

  1. 我们从两者获得密钥对。对于椭圆曲线密码,它是由mbedtls_pk_ec(...)宏完成的。对于rsa,需要mbedtls_rsa_context(...)

    mbedtls_ecp_keypair* crt_pair = mbedtls_pk_ec(crt->pk);
    mbedtls_ecp_keypair* pk_pair = mbedtls_pk_ec(*pk);
    

注意,尽管crt_pair现在是密钥对,但是只有其公共部分将为非零,因为证书显然没有私有密钥部分。 mbedtls_pk_ec(...)对我来说似乎是一些类似于宏的事物,因为它不使用指向结构的指针,而是直接使用结构。

  1. 然后,我们比较密钥对中的公钥:

    mbedtls_mpi *pk_pub_X = &pk_pair->Q.X;
    mbedtls_mpi *pk_pub_Y = &pk_pair->Q.Y;
    mbedtls_mpi *crt_pub_X = &crt_pair->Q.X;
    mbedtls_mpi *crt_pub_Y = &crt_pair->Q.Y;
    

在其他算法(RSA)的情况下,这些部分可能有所不同,但是我们总是需要一组大数(mbedtls_mpi),并比较这些大数。

  1. 然后,我们使用mbedtls大数功能对其进行比较:

    bool does_it_match = mbedtls_mpi_cmp_mpi(pk_pub_X, crt_pub_X) || mbedtls_mpi_cmp_mpi(pk_pub_Y, crt_pub_Y);

注:验证证书匹配项不足以验证证书有效性,仅对此需要。证书的验证可以通过已经更加愉快和简单的mbedtls_x509_crt_verify(...)功能完成。

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