Mbedtls可以使用x509的mbedtls_x509_crt_verify(...)函数(链接)来验证它的证书。
然而,我所拥有的是:
mbedtls_pk_context中)。证书的验证没有问题。
但是,如果该证书验证了另一个密钥,怎么办?(软件问题的结果是什么,也是破解的结果。)当然,这样的密钥/证书对将无法进行tls握手,但我不认为需要为此建立tcp连接。
本源 (尽管是针对openssl脚本编写的)使得证书-密钥匹配验证可以通过简单的模数匹配来实现。
还有一个mbedtls_pk_verify(...)函数(参考),但在我看来,它主要使用签名。但是我没有签名,我有一个证书(获得了pem格式),我的密钥(我也有一个pem格式)。将它们处理为内部mbedtls数据结构(mbedtls_x509_crt和mbedtls_pk_context)并不是一个问题,但我如何验证它们是否匹配呢?
发布于 2021-05-10 23:25:05
我知道这是一个更老的问题,但也许mbedtls_pk_check_pair就是你要找的。将私钥/公钥对和证书公钥传递给它。
/**
* \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 );发布于 2019-11-29 17:24:11
正如这 security.SE答案所述,如果证书和私钥文件中的公钥相同,那么验证就足够了。这是因为它是它们中唯一共有的共享信息。
因此,我们需要从mbedtls_pk_content和mbedtls_x509_cert中挖掘出公钥并对它们进行比较。
对于这个任务,mbedtls没有通用的API调用,但是它可以通过特定于算法的解决方案来完成。步骤如下。假设我们有
mbedtls_x509_cert crt;
mbedtls_pk_context pk;其中crt有证书,pk是我们的公钥对。
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(...)是一个类似宏的东西,因为它不使用指向结构的指针,而是直接使用结构。
在其他算法(RSA)中,这些部分可能不同,但是我们总是需要一组大数字(mbedtls_mpi),并对这些大数字进行比较。
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(...)函数来完成。
https://stackoverflow.com/questions/59075404
复制相似问题