如何检查 OpenSSL 中的私钥和证书是否与 ECDSA 匹配?

信息安全 加密 密码学 openssl 电子抄送
2021-08-18 15:24:13

我知道如何使用RSA密钥执行此操作(请参阅本文:确定私钥是否属于证书?)但是我不知道如何为ECDSA证书/密钥对执行此操作。

使用 RSA 密钥,可以使用模数。但是我不确定 ECDSA 的“等效”是什么。

谢谢!

2个回答

ECDSA 或包括 ECDH 在内的任何 ECC 的等效数据是公共点值和所用曲线的规范。在互操作性实践中,人们使用由标准化 OID(NIST、SECG 等)标识的曲线之一,并且大多数情况下仅使用 NSA Suite B“祝福”的两条曲线,即 nistp256 和 nistp384,尽管 ASN.1 格式(和 openssl 库) 可以支持任何(?)Weierstrass 形式的曲线。

但是简单的方法实际上与确定私钥是否属于证书?,我添加了一些可能的改进:

  1. 用于openssl x509 -in cert -pubkey从证书中获取字段,并将其与从私钥获得的(全部)公钥(以相同的 SPKI 编码)进行比较openssl ec -in key -pubout

    1A。而不是 RSA 和 ECC 私钥的不同命令,自 2010 年的 openssl 1.0.0 以来,您可以openssl pkey -in key -pubout对两者使用 algorithm-generic。

  2. 配置基于 openssl 的程序以(尝试)使用密钥和“拥有”证书。如果它们不匹配,openssl 库将返回程序应显示的错误。

    2A。无需设置整个服务器环境,或临时接管现有的环境,您只需openssl s_server -accept X -cert cfile -key kfile在 X 是您机器上可用的任何端口的位置运行 = 不受限制且当前未绑定或连接。如果它开始正常(证书和密钥匹配),只需 control-C(或等效)。

为了具体实现@dave_thompson_085 所说的内容,这可以解决问题 - 它从每个证书和私钥中提取公钥,然后计算它们的 md5 哈希,让您可以轻松地比较它们:

# openssl x509 -pubkey -in mydomain-ecc.crt -noout | openssl md5
(stdin)= 77e16c92c1a4907c7da34e72a1c5b879
# openssl pkey -pubout -in mydomain-ecc.key | openssl md5
(stdin)= 77e16c92c1a4907c7da34e72a1c5b879

自从发布此问题以来,已在 OP 链接的问题中添加了一个答案,提供了一个也可以与 ECC 证书一起使用的单行代码(使用pkey代替rsa),但它不提供可见的确认。