首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mbedtls验证证书是否验证了密钥?

如何使用mbedtls验证证书是否验证了密钥?
EN

Stack Overflow用户
提问于 2019-11-27 17:18:17
回答 2查看 2.4K关注 0票数 3

Mbedtls可以使用x509的mbedtls_x509_crt_verify(...)函数(链接)来验证它的证书。

然而,我所拥有的是:

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

证书的验证没有问题。

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

本源 (尽管是针对openssl脚本编写的)使得证书-密钥匹配验证可以通过简单的模数匹配来实现。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-10 23:25:05

我知道这是一个更老的问题,但也许mbedtls_pk_check_pair就是你要找的。将私钥/公钥对和证书公钥传递给它。

代码语言:javascript
复制
/**
 * \brief           Check if a public-private pair of keys matches.
 *
 * \param pub       Context holding a public key.
 * \param prv       Context holding a private (and public) key.
 *
 * \return          \c 0 on success (keys were checked and match each other).
 * \return          #MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE if the keys could not
 *                  be checked - in that case they may or may not match.
 * \return          #MBEDTLS_ERR_PK_BAD_INPUT_DATA if a context is invalid.
 * \return          Another non-zero value if the keys do not match.
 */
int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv );
票数 1
EN

Stack Overflow用户

发布于 2019-11-29 17:24:11

正如 security.SE答案所述,如果证书和私钥文件中的公钥相同,那么验证就足够了。这是因为它是它们中唯一共有的共享信息。

因此,我们需要从mbedtls_pk_contentmbedtls_x509_cert中挖掘出公钥并对它们进行比较。

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

代码语言:javascript
复制
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_偶对->q.X;mbedtls_mpi *pk_pub_Y =&pk_偶对->q.Y;mbedtls_mpi *crt_pub_X =&crt_偶对->q.X;mbedtls_mpi *crt_pub_Y =&crt_偶对->q.Y;

在其他算法(RSA)中,这些部分可能不同,但是我们总是需要一组大数字(mbedtls_mpi),并对这些大数字进行比较。

  1. 然后,我们使用mbedtls大数功能来比较它们: bool does_it_differ = mbedtls_mpi_cmp_mpi(pk_pub_X, crt_pub_X) || mbedtls_mpi_cmp_mpi(pk_pub_Y, crt_pub_Y);

注意:验证证书匹配不足以验证证书的有效性,这是必需的。证书的验证可以用已经更愉快和更简单的mbedtls_x509_crt_verify(...)函数来完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59075404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档