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

标签 openssl private-key public-key pem

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

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

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

最佳答案

I have a .pem file (base64-encoded cryptography information). What OpenSSL command-line should I use to detect whether it contains a public key or a private key?



通常,您必须检查 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 file format rfc draft request .

关于openssl - 如何知道 .pem 文件包含公钥还是私钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28569270/

相关文章:

android - 无法从 KeyStore 检索私钥

ssl - SSL 证书究竟是如何验证的?

shell - 如何检查公共(public) RSA key 文件

java - 为什么我的 RSA 2048 公钥是 294 字节长?

c# - 如何从签名的 C# exe 中读取公钥

c - OpenSSL ECB 非 64 位多纯文本

ssl - 创建 EC CSR 时命名曲线或域参数

android - opentok-android-sdk-2.3.1 和 OpenSSL 漏洞问题

java - 将私钥存储在 ServletContext 中

linux - 在 64 位 Debian wheezy 多架构主机上编译使用 ssl 的 32 位二进制文​​件