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

hop*_*pia 46 security openssl cryptography certificate

我需要解析.PEM文件.
我知道RFC 1421-24中定义了"隐私增强型电子邮件"的标准.但他们似乎没有提到我在OpenSSL .pem文件中找到的一些文本(例如"Key Attributes","BEGIN CERTIFICATE"等等).这是OpenSSL特定的格式吗?

ind*_*div 26

查看现有实现并了解它们的作用通常很有用.OpenSSL/LibreSSL在crypto/pem/pem.h中定义了这些BEGIN和END标记.例如,当前的LibreSSL具有以下内容:

# 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"
Run Code Online (Sandbox Code Playgroud)

据我所知,没有BEGIN/END标记的主列表.它们几乎是根据实现的需要定义的.然后,如果您想与该实现进行交互操作,则将字符串添加到您自己的字符串中.


mik*_*ana 20

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

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

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

    PKCS#10认证请求使用"CERTIFICATE REQUEST"标签进行编码.编码数据必须是[RFC2986]中描述的编码ASN.1 CertificationRequest结构的BER(DER强烈优选;参见附录B).

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

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

-----结束证书申请-----

图9:PKCS#10示例

"新证书请求"标签也被广泛使用.符合本文档的发生器必须生成"证书请求"标签.解析器可以将"新证书请求"视为等同于"证书请求".^


Sam*_*ivu 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

  • 谢谢你的回答.那样就好.此信息对于想要解析PEM文件的任何人都很有用. (2认同)

hop*_*pia 8

我发现了一个关于这个问题的旧线程.看起来封装边界没有"官方"标准格式,确定这一点的最佳方法是根据您在BEGIN语句中找到的众所周知的关键字猜测内容.

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