【问题标题】:How to check a public RSA key file如何检查公共 RSA 密钥文件
【发布时间】:2014-12-03 06:18:31
【问题描述】:

在一个 shell 脚本中,我想验证公共 RSA 文件。 我想做的就是找到一种方法来检查这个文件是一个真正的公钥文件,没有别的。

请问这里的专家有什么方法可以验证这个输入文件以检查这是一个真正的公钥文件,而不是一个普通文件。

我将来会使用这个公钥文件来验证传入的加密 gzip 文件,但现在超出了范围。

我想要的只是验证输入文件以检查其真正的 RSA 公钥文件而不是普通文件。请注意我没有任何其他文件(例如:私钥)。

例如:如果文件是‘public.pem’,我只想在里面检查它是一个真正的 RSA 公钥文件,而不仅仅是一个带有文本的文件或文件没有损坏。 我已经在检查文件不是零大小和 md5 。

我发现的其他可能的检查 检查文件得到文本‘BEGIN PUBLIC KEY’‘END PUBLIC KEY’ 在 google 中也找到了这个命令,有没有更好的方法使用 openssl 来做到这一点

‘openssl rsa -noout -text -inform PEM -in pubkey.pem -pubin’

谢谢

【问题讨论】:

  • 使用 openssl 可能是您想要执行此操作的唯一方法。简单地检查开始/结束分隔符是没有意义的。我可以向您发送带有BEGIN PUBLIC KEY heeheeheethisisnotvalidrsa END PUBLIC KEY 的文件,您的“验证者”会接受。
  • 这就是为什么我想知道一个更好的方法来验证这个公共 rsa 文件,请注意这是一个远程服务器的公共 RSA 文件。

标签: shell openssl rsa public-key pem


【解决方案1】:

可以使用任何公钥格式解析器,包括openssl,甚至可以自己解析密钥,因为格式并不难。

当解析失败时,命令行工具设置一个非零的退出代码:

openssl rsa -inform PEM -pubin -in pubkey.pem -noout &> /dev/null
if [ $? != 0 ] ; then
    echo "this was definitely not a RSA public key in PEM format"
    exit 1
fi

只是为了检查任何公钥:

openssl pkey -inform PEM -pubin -in pubkey.pem -noout &> /dev/null
if [ $? != 0 ] ; then
    echo "this was definitely not a public key in PEM format"
    exit 1
fi

【讨论】:

  • 假设您的意思是 Java (JRE) 密钥工具,它无法读取公钥。一个证书是的,然后一个应用程序可以从证书中.getPublicKey(),但公钥直接没有。 OTOH 应用程序可以直接读取 DER 中的通用 (PKCS#8) pubkey,但如果没有像 BouncyCastle 这样的插件,base64 就不太容易了。顺便说一句,openssl 上的命令行 -inform PEM 是默认值,可以省略,而输出选项 -text -noout 可以在您丢弃输出时省略;或使用 -noout 并且没有其他不需要丢弃的输出选项。
  • 是的,看起来 keytool 无法做到这一点。例如,base64 实用程序和 Java 中的 javax.xml.bind.DataTypeConverter 类都支持 base64。我喜欢明确说明格式和其他内容,跳过格式也没有太大的收获。你是对的,-noout-text 一起没有意义,但输出仍然必须丢弃,因为即使使用 -noout 选项也可能报告错误消息。
  • 你说得对,我忘记了 javax.xml,当我第一次遇到这个问题时,它并不存在。尽管您实际上需要 base64 和 BEGIN/END 处理,但还需要几行代码。 -noout -text 确实有意义 together (在没有编码证书的情况下输出人类可读的显示),类似-noout -subject -enddate 的组合也是如此;当标准输出被丢弃时,它们没有任何区别。您丢弃错误消息也是正确的;我已经习惯了,几乎没有注意到,但其他人会。
  • 请注意未来的我:你可以这样做openssl pkey -inform PEM -pubin -in pubkey.pem -noout &> /dev/null || echo "this was definitely not a public key in PEM format"
  • 是否可以针对认证链进行验证?确保证书(公钥)来自有效的私钥......在答案中找不到:(
【解决方案2】:

以下脚本应该适用于 OpenSSL 支持的所有 PEM 格式的密钥和证书。我已经在具有匹配和不匹配证书的各种有效和无效 ECDSA 和 RSA 密钥上对其进行了测试。

将此保存为 verify-cert-key:

#!/usr/bin/env bash
certFile="${1}"
keyFile="${2}"
certPubKey="$(openssl x509 -noout -pubkey -in "${certFile}")"
keyPubKey="$(openssl pkey -pubout -in "${keyFile}")"
if [[ "${certPubKey}" == "${keyPubKey}" ]]
then
  echo "PASS: key and cert match"
else
  echo "FAIL: key and cert DO NOT match"
fi

使其可执行:

chmod +x verify-cert-key

在证书和密钥上运行它:

./verify-cert-key server-crt.pem server-key.pem

【讨论】:

  • 我应该注意到,运行命令并进行视觉比较非常容易
  • @ricardo-saracino 是否会在公开密钥的长度为几十个十六进制数字并且可能偏离一位数字时直观地比较它们会使您面临更大的错误风险?
猜你喜欢
  • 2013-05-05
  • 2020-07-05
  • 2023-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多