指定的PEM文件格式在哪里?

时间:2011-03-18 16:34:43

标签: security openssl cryptography certificate

我需要解析.PEM文件 我知道RFC 1421-24中定义了“隐私增强型电子邮件”的标准。但他们似乎没有提到我在OpenSSL .pem文件中找到的一些文本(例如“关键属性”,“开始证书”等等) 这是OpenSSL特定的格式吗?

6 个答案:

答案 0 :(得分:22)

很长一段时间以来,关于密码交换信息,没有正式的PEM格式规范。 PEM是文本编码,但实际编码的内容取决于上下文。 2015年4月,IETF批准了RFC 7468,最终记录了各种实现如何使用PEM文本编码交换数据。以下列表直接取自RFC,描述了用于以下场景的PEM格式:

  1. 证书,证书撤销列表(CRL)和主题    Internet X.509公钥中的公钥信息结构    基础设施证书和证书撤销清单(CRL)    资料 [RFC5280]
  2. PKCS#10:认证请求语法 [RFC2986]
  3. PKCS#7:加密消息语法 [RFC2315]
  4. 加密消息语法 [RFC5652]
  5. PKCS#8:私钥信息语法 [RFC5208],重命名为One    非对称密钥包 [RFC5958]中的非对称密钥和加密密钥    相同文档中的私钥信息语法。
  6. Internet属性证书中的属性证书    授权简介 [RFC5755]
  7. 根据此RFC,对于上述方案,您可以预期以下标签位于 BEGIN 标题和 END 页脚内。 RFC的图4有更多细节,包括相应的ASN.1类型。

    但是,这不是完整的故事。 RFC是通过查看现有实现并记录他们所做的事情来编写的。 RFC不是首先编写的,也不是基于一些现有的权威文档编写的。因此,如果您最终处于需要与某些实现进行互操作的情况,则可能需要查看实现的源代码以确定它们支持的内容。

    例如,OpenSSL在crypto/pem/pem.h中定义了这些BEGIN和END标记。以下是头文件的摘录,其中包含所有支持的BEGIN和END标签。

    # define PEM_STRING_X509_OLD     "X509 CERTIFICATE"
    # define PEM_STRING_X509         "CERTIFICATE"
    # 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_DHXPARAMS    "X9.42 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"
    

    这些标签是一个开始,但您仍然需要研究实现如何对标签之间的数据进行编码。对于一切都没有一个正确答案。

答案 1 :(得分:20)

更新了2015年的答案:由于用户已经回答了两次,在主持人@royhowie删除答案之前:现在有RFC 7468 which defines the PEM headers。以下引用只是一小部分,你应该阅读实际的规范,它可能会在互联网上停留的时间远远超过StackOverflow。

但是@royhowie删除了指向RFC的每个答案为“仅链接”,除非它有一些文本。所以这里有一些文字:

  
      
  1. PKCS#10认证请求语法的文本编码

         

    PKCS#10认证请求使用   “CERTIFICATE REQUEST”标签。编码数据必须是BER(DER   强烈的;见附录B)编码的ASN.1   CertificationRequest结构,如[RFC2986]中所述。

  2.         

    -----开始证书申请-----

         

    MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNp​​bW9uIEpvc2Vm   c3NvbiBEYXRha29uc3VsdCBBQjEWMBQGA1UEAxMNam9zZWZzc29uLm9yZzBOMBAG   ByqGSM49AgEGBSuBBAAhAzoABLLPSkuXY0l66MbxVJ3Mot5FCFuqQfn6dTs + 9 / CM   EOlSwVej77tj56kj9R / j9Q + LfysX8FO9I5p3oGIwYAYJKoZIhvcNAQkOMVMwUTAY   BgNVHREEETAPgg1qb3NlZnNzb24ub3JnMAwGA1UdEwEB / wQCMAAwDwYDVR0PAQH /   BAUDAwegADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgM / ADA8   AhxBvfhxPFfbBbsE1NoFmCUczOFApEuQVUw3ZP69AhwWXk3dgSUsKnuwL5g / ftAY   dEQc8B8jAcnuOrfU

         

    -----结束证书请求-----

         

    图9:PKCS#10示例

         

    标签“新证书请求”也被广泛使用。发电机      符合本文件必须生成“证书请求”      标签。解析器可以将“新证书请求”视为等同于      “证书请求”。^

答案 2 :(得分:13)

为了让你开始:据我所知,如果有一个人类可读的部分(有文字和东西),这意味着人类操作员要知道有关的认证是什么,有效期等等。快速手动验证。所以你可以忽略它。

您需要解析BEGIN-END块之间的内容。

在里面,您将找到Base64编码实体,您需要将Base64解码为字节。这些字节表示DER编码的证书/密钥/等。我不确定你可以用什么好的库来解析DER数据。

作为了解每个块内部数据的测试,您可以将BEGIN-END块之间的内容粘贴到此站点,该站点在JavaScript中进行ASN.1解码:

http://lapo.it/asn1js/

虽然我不会将任何生产环境私钥粘贴到任何网站(虽然这似乎只是一个javascript)。

Base64:http://en.wikipedia.org/wiki/Base64

DER:http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules

ASN.1:http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One

答案 3 :(得分:8)

我找到了关于此问题的old thread。看起来封装边界没有“官方”标准格式,确定这一点的最佳方法是根据您在BEGIN声明中找到的众所周知的关键字猜测内容。

正如indiv所回答的那样,有关关键字的完整列表,请参阅OpenSSL加密/ pem / pem.h头文件。

答案 4 :(得分:2)

我不确定它是否特定于OpenSSL,但PEM Encryption Format的文档可能正是您所寻找的。

答案 5 :(得分:0)

  

指定了PEM文件格式在哪里?

没有一个地方。这取决于标准。您甚至可以构建自己的封装边界,并在自己的软件中使用它们。

正如@indiv所说,OpenSSL在<openssl dir>/crypto/pem/pem.h有一个相当全面的列表。

有人要求PKIX工作组提供一份类似于2006年要求的清单。工作组拒绝了。请参阅PEM file format rfc draft request