我需要解析.PEM文件 我知道RFC 1421-24中定义了“隐私增强型电子邮件”的标准。但他们似乎没有提到我在OpenSSL .pem文件中找到的一些文本(例如“关键属性”,“开始证书”等等) 这是OpenSSL特定的格式吗?
答案 0 :(得分:22)
很长一段时间以来,关于密码交换信息,没有正式的PEM格式规范。 PEM是文本编码,但实际编码的内容取决于上下文。 2015年4月,IETF批准了RFC 7468,最终记录了各种实现如何使用PEM文本编码交换数据。以下列表直接取自RFC,描述了用于以下场景的PEM格式:
根据此RFC,对于上述方案,您可以预期以下标签位于 BEGIN 标题和 END 页脚内。 RFC的图4有更多细节,包括相应的ASN.1类型。
例如,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的每个答案为“仅链接”,除非它有一些文本。所以这里有一些文字:
- 醇>
PKCS#10认证请求语法的文本编码
PKCS#10认证请求使用 “CERTIFICATE REQUEST”标签。编码数据必须是BER(DER 强烈的;见附录B)编码的ASN.1 CertificationRequest结构,如[RFC2986]中所述。
-----开始证书申请-----
MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm 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解码:
虽然我不会将任何生产环境私钥粘贴到任何网站(虽然这似乎只是一个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的文档可能正是您所寻找的。 p>
答案 5 :(得分:0)
指定了PEM文件格式在哪里?
没有一个地方。这取决于标准。您甚至可以构建自己的封装边界,并在自己的软件中使用它们。
正如@indiv所说,OpenSSL在<openssl dir>/crypto/pem/pem.h
有一个相当全面的列表。
有人要求PKIX工作组提供一份类似于2006年要求的清单。工作组拒绝了。请参阅PEM file format rfc draft request。