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

时间:2015-02-17 19:12:15

标签: openssl private-key public-key pem

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

this StackOverflow question中所述,.pem可以包含两者。

由于该文件的内容是基本的乱码,当将.pem证书发送到其他机器时,我想确保我导出公钥而不是发出我的私钥。

2 个答案:

答案 0 :(得分:2)

  

我有一个.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 blob加载到具有PEM_read_bio_RSAPrivateKey的RSA私钥中。如果成功,那么它是一个RSA私钥。如果失败,那么它可能是损坏的RSA私钥,或者它可能是EC私钥,或者它可能不是PEM blob。


2006年,我们要求PKIX工作组标准化事物的名称。它在IETF中被置若罔闻。请参阅PEM file format rfc draft request

答案 1 :(得分:2)

作为一个应该捕捉大多数(全部?)人类错误的实用近似值,我建议只filegrep

(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

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