gpt4 book ai didi

ssl - 如何在没有可导出私钥的情况下进行 ECDHE 握手

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:21 27 4
gpt4 key购买 nike

我正在构建一个实现 ECDSA_METHOD 的 OpenSSL 引擎,其中包括签名创建和签名验证功能。由于 ECDHE 私钥的唯一用途是与签名创建相关,因此不需要从引擎导出 key 并将其呈现在其他任何地方。

但是,如果我不通过 SSL_set_private_key 函数向 SSL_Context 提供私钥,SSL 握手将失败并出现以下错误:

error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

我还尝试向 SSL_set_private_key 函数提供一个模拟 key (与证书中的公钥无关的 key ),但此函数确实验证私钥/公钥是否匹配,如果出现错误,则会抛出错误证书他们没有。

在某些情况下,openssl 似乎允许绕过此验证,例如这是我在 ssl/ssl_rsa.c 中找到的

#ifndef OPENSSL_NO_RSA
/*
* Don't check the public/private key, this is mostly for smart
* cards.
*/
if ((pkey->type == EVP_PKEY_RSA) &&
(RSA_flags(pkey->pkey.rsa) & RSA_METHOD_FLAG_NO_CHECK)) ;
else
#endif
if (!X509_check_private_key(c->pkeys[i].x509, pkey)) {
X509_free(c->pkeys[i].x509);
c->pkeys[i].x509 = NULL;
return 0;
}

我想,我需要类似的 EC key ,但我没有在任何地方找到它。也欢迎任何其他解决方案。

最佳答案

Any other solutions are appreciated as well.

这可能不是您唯一的选择,但我认为您可以通过创建自己的 EVP_PKEY_METHOD 来实现您正在寻找的东西。并根据需要履行其职能。这样,您可以存储您自己的句柄,例如,基于智能卡的 key ,然后在适当的时候调用适当的签名方法。您必须使用 EVP_PKEY_meth_set_Xyz() 设置正确的方法功能,如 EVP_PKEY_meth_set_sign(<yourSigningFunction>) .例如,如果您使用的是 Windows 加密 API,则必须调用 NCryptSignHash()从您的签名功能。这样,您就不必从 Windows keystore 中导出私钥来获取签名。

我以前做过这个,我遇到的唯一大问题(除了缺少文档和示例)是 EVP 缺少 key 存储功能。等级。如您所见here,似乎正在进行一些工作.作为解决方法,我不得不从商店中选择 key /证书作为 key 生成机制的一部分,但它并不是真正用于此目的。

如果您决定走这条路,请准备好几周的反复试验。

关于ssl - 如何在没有可导出私钥的情况下进行 ECDHE 握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33977131/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com