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

Security 指定的PEM文件格式在哪里?,security,openssl,cryptography,certificate,Security,Openssl,Cryptography,Certificate,我需要解析.PEM文件。 我知道RFCs 1421-24中定义了“增强隐私的电子邮件”的标准。但他们似乎没有提到我在OpenSSL.pem文件中找到的一些文本(如“密钥属性”、“开始证书”等) 这是一种特定于OpenSSL的格式吗?我不确定它是否特定于OpenSSL,但它的文档可能是您正在寻找的内容。让您开始吧:据我所知,如果有一个部分是人类可读的(有文字和其他内容),这意味着人类操作员可以知道有问题的证书是什么,有效期等,用于快速手动验证。所以你可以忽略这一点 您将需要解析开始和结束块之间的内

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

我不确定它是否特定于OpenSSL,但它的文档可能是您正在寻找的内容。

让您开始吧:据我所知,如果有一个部分是人类可读的(有文字和其他内容),这意味着人类操作员可以知道有问题的证书是什么,有效期等,用于快速手动验证。所以你可以忽略这一点

您将需要解析开始和结束块之间的内容

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

作为了解每个块内数据的测试,您可以将开始和结束块之间的数据粘贴到此网站,该网站使用JavaScript进行ASN.1解码:

尽管我不会将任何生产环境私钥粘贴到任何站点(尽管这似乎只是一个javascript)

Base64:

德:


ASN.1:

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

  • 证书、证书吊销列表(CRL)和主题 Internet中的公钥信息结构X.509公钥 基础结构证书和证书吊销列表(CRL) 个人资料
  • PKCS#10:认证请求语法
  • PKCS#7:加密消息语法
  • 加密消息语法
  • PKCS#8:私钥信息语法,重命名为1 非对称密钥包中的非对称密钥,并加密 同一文档中的私钥信息语法
  • Internet属性证书中的属性证书 授权配置文件
  • 根据此RFC,对于上述场景,您可以预期以下标签位于开始页眉和结束页脚内。RFC的图4有更多的细节,包括相应的ASN.1类型

    • 证书
    • X509 CRL
    • 证书请求
    • PKCS7
    • CMS
    • 私钥
    • 加密私钥
    • 属性证书
    • 公钥
    不过,这还不是全部。RFC是通过查看现有的实现并记录它们所做的工作而编写的。RFC不是首先编写的,也不是基于一些现有的权威文档编写的。因此,如果您最终想要与某个实现进行交互操作,那么您可能需要查看该实现的源代码以了解它们支持什么

    # 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"
    
    例如,OpenSSL在中定义了这些开始和结束标记。下面是头文件的摘录,其中包含了头文件支持的所有开始和结束标签

    # 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"
    
    这些标签只是一个开始,但是您仍然需要研究实现如何在标签之间对数据进行编码。没有一个对所有问题都正确的答案。

    我找到了一个关于这个问题的答案。封装边界似乎没有“官方”标准格式,确定这一点的最佳方法是根据
    BEGIN
    语句中的已知关键字猜测内容

    如indiv所回答的,有关关键字的完整列表,请参阅OpenSSL crypto/pem/pem.h头文件

    指定的PEM文件格式在哪里

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

    正如@indiv所述,OpenSSL在
    /crypto/pem/pem.h
    上有一个相当全面的列表


    有人要求PKIX工作组提供一份清单,就像你在2006年要求的那样。工作组拒绝了。请参阅。

    2015年更新答案:由于用户已经回答了两次,在主持人@royhowie删除答案之前:现在有了。下面的引用只是一小部分,您应该阅读实际的规范,它在互联网上的停留时间可能比StackOverflow长得多

    但是@royhowie会删除所有指向RFC的“仅链接”答案,除非它有一些文本。下面是一些文字:

    7。PKCS#10认证请求语法的文本编码

    PKCS#10认证请求使用 “证书申请”标签。编码的数据必须是( 强烈推荐;参见)编码ASN.1 如[]所述的CertificationRequest结构

    图9:PKCS#10示例

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


    谢谢,但我正在寻找关于正在使用的其他BEGIN-END语句的更全面的信息,如“BEGIN证书”和“BEGIN私钥”。仅供参考,链接已关闭。我可能稍微误解了问题的重点:)谢谢您的回答。那很好。这些信息对任何正在寻找的人都很有用