如何知道.pem文件是否包含公钥或私钥?

我有一个.pem文件(base64编码的密码信息)。 我应该使用哪些OpenSSL命令行来检测它是否包含公钥或私钥?

正如在这个StackOverflow问题中所解释的,.pem可以同时包含两者。

由于该文件的内容是乱码base64,当向其他机器发送.pem证书时,我想确保我正在导出公钥并且不会泄露我的私钥。


我有一个.pem文件(base64编码的密码信息)。 我应该使用哪些OpenSSL命令行来检测它是否包含公钥或私钥?

通常,您必须检查PEM文件的第一行以确定存在的内容。

OpenSSL可以检测可用编码事物的一个子集(因为没有更好的术语)。 您可以通过检查<openssl src>/crypto/pem/pem.h来查看OpenSSL可以解码的列表。 从文件中:

#define PEM_STRING_X509_OLD "X509 CERTIFICATE"
#define PEM_STRING_X509     "CERTIFICATE"
#define PEM_STRING_X509_PAIR    "CERTIFICATE PAIR"
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE"
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST"
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST"
#define PEM_STRING_X509_CRL "X509 CRL"
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY"
#define PEM_STRING_PUBLIC   "PUBLIC KEY"
#define PEM_STRING_RSA      "RSA PRIVATE KEY"
#define PEM_STRING_RSA_PUBLIC   "RSA PUBLIC KEY"
#define PEM_STRING_DSA      "DSA PRIVATE KEY"
#define PEM_STRING_DSA_PUBLIC   "DSA PUBLIC KEY"
#define PEM_STRING_PKCS7    "PKCS7"
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA"
#define PEM_STRING_PKCS8    "ENCRYPTED PRIVATE KEY"
#define PEM_STRING_PKCS8INF "PRIVATE KEY"
#define PEM_STRING_DHPARAMS "DH PARAMETERS"
#define PEM_STRING_SSL_SESSION  "SSL SESSION PARAMETERS"
#define PEM_STRING_DSAPARAMS    "DSA PARAMETERS"
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY"
#define PEM_STRING_PARAMETERS   "PARAMETERS"
#define PEM_STRING_CMS      "CMS"

有些事情会比其他事情更困难。 例如,它显而易见的是RSA PUBLIC KEY是什么,但它不那么明显, PUBLIC KEY是什么。 在这种情况下,你需要做两件事情之一。 首先,你ASN.1 / DER解码这个东西,然后查看它的OID(如果有的话)。 其次,您尝试加载到您期望的事物的数据结构中。

作为第二种策略的示例,您将尝试使用PEM_read_bio_RSAPrivateKey将PEM blob加载到RSA私钥中。 如果成功,那么它是一个RSA私钥。 如果它失败了,那么它可能是一个损坏的RSA私钥,或者它可能是一个EC私钥,或者它可能不是PEM blob。


在2006年,有人要求将PKIX工作组的名称标准化。 它在IETF中充耳不闻。 请参阅PEM文件格式rfc草稿请求。


作为一个应该能够捕捉大多数(所有?)人为错误的实际近似,我只会建议file和grep:

(file $KEYFILE | grep -i private >/dev/null) && echo Private || echo Public-or-unknown

在屏幕出现之前屏蔽一些关键材料:

 for f in *; do (file $f | grep -i private >/dev/null) && file $f; done

空输出=希望没有秘密,可以继续。

链接地址: http://www.djcxy.com/p/83755.html

上一篇: How can I know if a .pem file contains public or private key?

下一篇: Why Is InterruptedException a Checked Exception?