Openssl 如何知道.pem文件包含公钥还是私钥?

Openssl 如何知道.pem文件包含公钥还是私钥?,openssl,private-key,public-key,pem,Openssl,Private Key,Public Key,Pem,我有一个.pem文件(base64编码的加密信息)。我应该使用什么OpenSSL命令行来检测它是包含公钥还是私钥 如中所述,一个.pem可以同时包含这两个部分 由于该文件的内容是乱码base64,因此在将.pem证书发送到其他计算机时,我希望确保导出的是公钥,而不是私钥 我有一个.pem文件(base64编码的加密信息)。我应该使用什么OpenSSL命令行来检测它是包含公钥还是私钥 通常,您必须检查PEM文件的第一行以确定存在的内容 OpenSSL可以检测可用编码事物的子集(因为缺少更好的术语)

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

如中所述,一个.pem可以同时包含这两个部分

由于该文件的内容是乱码base64,因此在将.pem证书发送到其他计算机时,我希望确保导出的是公钥,而不是私钥

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

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

OpenSSL可以检测可用编码事物的子集(因为缺少更好的术语)。通过检查
/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公钥
是显而易见的,但什么是
公钥
就不那么明显了。在这种情况下,您可以执行以下两种操作之一。首先,ASN.1/DER解码该对象,然后查找其OID(如果可用)。其次,您尝试将数据加载到您期望的数据结构中

作为第二种策略的示例,您可以尝试使用
PEM\u read\u bio\u RSAPrivateKey
将一个PEM blob加载到RSA私钥中。如果成功,则它是一个RSA私钥。如果失败,那么它可能是损坏的RSA私钥,也可能是EC私钥,也可能不是PEM blob



2006年,要求PKIX工作组对物品名称进行标准化。IETF对此充耳不闻。请参阅。

作为一个实用的近似值,应该能够抓住大多数(所有?)人为错误,我建议您:

要在某些关键材料发出前进行筛选,请执行以下操作:

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

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

不工作<代码>文件返回我的私钥“ASCII文本”。最好是grep为“public”,然后默认为private,因为如果你的猜测是保守的,那么出错的问题就比较少。这个答案有很多深度(这很好!),但无法解释最基本的,必要部分:如何运行openssl命令来检索这些信息。具有讽刺意味的是,RFC 7468在编写两个月后才问世。顺便说一句,
PEM_STRING_EVP_PKEY“ANY PRIVATE KEY”
PEM_STRING_PARAMETERS“PARAMETERS”
是仅在
crypto/PEM/{PEM_PKEY,PEM_lib}.c
之间使用的伪值,它们在实际文件中不会以这种方式出现<如果它是RSA privatekey,但经过加密,并且您没有提供正确的密码,则代码>读取…RSAPrivateKey也会失败(尽管在这种情况下,将其提供给其他人可能不会太不安全)。
 for f in *; do (file $f | grep -i private >/dev/null) && file $f; done