如何将私钥与提供的证书进行匹配?

如何将私钥与提供的证书进行匹配?

有人给了我一份证书和几个私钥/公钥,并说:“告诉我哪个私钥与证书匹配。”我该怎么做?

该证书采用 PKCS #7 格式,以以下内容开头:

-----BEGIN CERTIFICATE-----

这些密钥看起来都不一样。其中一些实际上是公钥 - 有些我不确定。它们有不同的扩展名并以不同的字符串开头,例如:

-----BEGIN PRIVATE KEY-----
-----BEGIN EC PARAMETERS-----
-----BEGIN RSA PRIVATE KEY-----

有什么帮助吗?我想我可以使用 openssl 命令行工具。

答案1

根据给出的命令验证私钥是否与证书匹配(最初是从Apache SSL 常见问题解答)可以构建一个小型 bash 脚本,遍历*.key文件夹中的所有文件并比较模量一次使用每个密钥复制证书的部分。

findkey.sh将证书的文件名作为命令行参数并打印匹配项。

#!/bin/bash
cert=$1
crthash=$(openssl x509 -noout -modulus -in "$cert" | openssl md5)
echo $cert $crthash

for file in *.key; do
    [ -e "$file" ] || continue
    keyhash=$(openssl rsa -noout -modulus -in "$file" | openssl md5)
    if [ "$keyhash" = "$crthash" ]
    then
        keytest==$(openssl rsa -in "$file" -check -noout)
        echo $file $keyhash $keytest
    fi
done

我创建了一些密钥对testN.key/testN.crt并测试了我的脚本,它似乎可以完成工作:

./findkey.sh test4.crt
test4.crt (stdin)= 8e30eac60ff8d3c5b1c9bee7e79774bb
test4.key (stdin)= 8e30eac60ff8d3c5b1c9bee7e79774bb =RSA key ok

密钥中是否有证书(或证书请求)并不重要,因为即使错误地命名为,*.key也会openssl rsa -modulus给出unable to load Private Key错误而不是证书的模数。此外,行尾会告诉密钥是否一致,以防止伪造私钥。您只需要安装此脚本和 OpenSSL。

答案2

您可以使用证书密钥匹配工具来检查您的私钥是否与证书匹配,如下所示:

https://www.sslshopper.com/certificate-key-matcher.html

此外,如果您想使用 openssl 命令行工具,建议阅读以下内容:

答案3

最简单的匹配方法是使用私钥生成签名,然后尝试所有证书来验证签名。如果由于证书仅用于加密而失败,那么您可以覆盖它,或者加密某些内容,然后使用私钥解密。

如果任何这些操作成功,那么你就知道你找到了匹配项;根据定义,这些操作只有使用正确的密钥才能成功,不管使用的算法。请注意,您当然应该确保不签署/加密任何敏感信息。最好最后丢弃结果。

您需要确保对解密/验证期间使用的方案使用正确的操作(但我想这是给定的)。顺便说一句,ECDSA 只能用于签名生成/签名。

唯一不太好的做法是当您有具有法律约束力的签名或使用私钥的计数器(例如在硬件设备中)时。


请注意,为了正确加密/验证,您需要相信公钥。这意味着您需要验证证书并验证证书上的签名。

相关内容