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

Suz*_*ron 8 openssl pem public-key private-key

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

正如StackOverflow问题中所解释的那样,.pem可以包含两者.

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

jww*_*jww 2

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

一般来说,您必须检查 PEM 文件的第一行以确定存在什么。

OpenSSL 可以检测可用编码内容的子集(由于缺乏更好的术语)。您可以通过检查来查看 OpenSSL 可以解码的列表<openssl src>/crypto/pem/pem.h。从文件中:

#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"
Run Code Online (Sandbox Code Playgroud)

有些事情会比其他事情更困难。例如,a 是什么很明显RSA PUBLIC KEY,但 a 是什么却不是那么明显PUBLIC KEY。在这种情况下,您可以执行以下两件事之一。首先,您使用 ASN.1/DER 解码该事物,然后查找其 OID(如果可用)。其次,您尝试加载到您期望的数据结构中。

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


2006 年,PKIX 工作组提出了标准化事物名称的请求。IETF 内部对此充耳不闻。请参阅PEM 文件格式 rfc 草案请求

  • 这个答案很深入(这太棒了!),但未能解释最基本、必要的部分:如何运行 openssl 命令来检索其中一些信息。 (4认同)