【问题标题】:How can I know if a .pem file contains public or private key?我如何知道 .pem 文件是否包含公钥或私钥?
【发布时间】:2015-04-18 14:34:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: openssl private-key public-key pem


    【解决方案1】:

    我有一个 .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 file format rfc draft request

    【讨论】:

    • 这个答案深入很多(这很棒!),但未能解释最基本、必要的部分:如何运行 openssl 命令来检索其中的一些信息。
    • 具有讽刺意味的是,RFC 7468 仅在撰写本文两个月后发布。顺便说一句,PEM_STRING_EVP_PKEY "ANY PRIVATE KEY"PEM_STRING_PARAMETERS "PARAMETERS" 是仅在crypto/pem/{pem_pkey,pem_lib}.c 之间使用的虚拟值,它们在实际文件中永远不会以这种方式出现。如果read...RSAPrivateKey 一个 RSA 私钥但已加密并且您没有提供正确的密码(尽管在这种情况下将其提供给其他人可能不会太不安全),它也会失败。
    【解决方案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
    

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

    【讨论】:

    • 不工作。 file 返回我的私钥“ASCII 文本”。
    • 最好用 grep 表示“public”,然后默认为 private,因为当您的猜测保守时,错误的问题会更小。
    猜你喜欢
    • 2011-11-24
    • 2020-06-08
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多