在 shell 脚本中我想验证公共 RSA 文件
public.pem
。
我想要的只是检查该文件是否是真正的 RSA 公钥文件,而不是其他文件,例如常规文件或损坏的密钥。
我将来将使用此公钥文件来验证传入的加密 gzip 文件,但这超出了现在的范围。
请注意,我没有携带任何其他文件(例如私钥)。
我已经检查过文件大小不为零并且我使用 MD5。
我发现的另一个可能的检查是该文件包含文本
BEGIN PUBLIC KEY
和 END PUBLIC KEY
。
我还通过 Google 找到了这个命令:
openssl rsa -noout -text -inform PEM -in pubkey.pem -pubin
有没有更好的方法使用
openssl
来做到这一点?
可以使用任何公钥格式解析器,包括
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
以下脚本应适用于 OpenSSL 支持的所有 PEM 格式的密钥和证书。我已经使用匹配和不匹配的证书在各种有效和无效的 ECDSA 和 RSA 密钥上对其进行了测试。
将其另存为验证证书密钥:
#!/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
如果您的公钥以
-----BEGIN RSA PUBLIC KEY-----
开头,请尝试此命令
openssl rsa -RSAPublicKey_in -in /path/to/pub_key.pem -noout -text