在哪里指定PEM文件格式?

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

看看现有的实现通常是有益的,看看他们做了什么。 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_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" 

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

为了让你开始:据我所知,如果有一部分是人类可读的(包括文字和东西),这是为了让人类操作员知道有问题的证书是什么,失效date等,以便快速手动validation。 所以你可以忽略这个。

您将需要parsingBEGIN-END块之间的内容。

在里面,你会发现一个Base64编码的实体,你需要Base64解码成字节。 这些字节表示DER编码的证书/密钥/等。 我不知道你可以用什么好的库来分析DER数据。

为了理解每个块内的数据,可以将BEGIN-END块之间的内容粘贴到这个在JavaScript中进行ASN.1解码的站点:

http://lapo.it/asn1js/

虽然我不会把任何生产环境私钥粘贴到任何网站(尽pipe这似乎只是一个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

更新2015年的答案 :由于用户已经回答了两次,在版主@royhowie删除答案之前:现在有RFC 7468,它定义了PEM头 。 下面的引用只是一小部分,你应该阅读实际的规格,这可能会停留在互联网上比StackOverflow更长。

但@royhowie删除每个答案为“只有链接”,除非它有一些文字。 所以这里是一些文字:

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

    PKCS#10authentication请求使用“CERTIFICATE REQUEST”标签进行编码。 编码后的数据必须是[RFC2986]中描述的编码ASN.1authentication请求结构的BER(DER强烈偏好;见附录B)。

—–开始证书申请—–

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

—–结束证书请求—–

图9:PKCS#10示例

“新证书请求”标签也被广泛使用。 符合这个文件的生成器必须生成“证书请求”标签。 parsing器可以将“新证书请求”视为等同于“证书请求”。^

我发现一个关于这个问题的旧线索 。 看起来封装边界没有“官方”标准格式,确定这种格式的最好方法是根据您在BEGIN语句中find的众所周知的关键字猜测内容。

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

我不确定是否特定于OpenSSL,但是PEMencryption格式的文档可能是您正在寻找的。

在哪里指定PEM文件格式?

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

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

有人要求PKIX工作组提供一个列表,就像你在2006年要求的那样。工作组拒绝了。 请参阅PEM文件格式rfc草稿请求 。