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的每个答案为"仅链接",除非它有一些文本.所以这里有一些文字:
PKCS#10认证请求语法的文本编码
PKCS#10认证请求使用"CERTIFICATE REQUEST"标签进行编码.编码数据必须是[RFC2986]中描述的编码ASN.1 CertificationRequest结构的BER(DER强烈优选;参见附录B).
-----开始证书申请-----
MIIBWDCCAQcCAQAwTjELMAkGA1UEBhMCU0UxJzAlBgNVBAoTHlNpbW9uIEpvc2Vm 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解码:
虽然我不会将任何生产环境私钥粘贴到任何站点(虽然这似乎只是一个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