什么是 .pem
、.cer
和 .der
的区别?
据我所知,.cer
包含公钥。是否有任何开源框架可以使用该公钥加密数据?
什么是 .pem
、.cer
和 .der
的区别?
据我所知,.cer
包含公钥。是否有任何开源框架可以使用该公钥加密数据?
.pem
、.cer
和 .der
都是文件扩展名,这些文件可能包含 X.509 v3 证书。
.der
扩展名DER 是一种编码证书数据的方法。DER 本身可以表示任何类型的数据,但通常它描述了一个编码的证书或 CMS 容器。CMS 在 PKCS#7 中描述(通常存储为.p7
),代表密码消息语法,可用于保护消息并存储证书,以允许接收方在其信任库中构建信任路径到证书。
证书的结构使用 ASN.1 数据表示语言进行描述。BER 和 DER 是用于由 ASN.1 描述的数据的二进制编码方法。
.pem
扩展名PEM 是将二进制数据编码为字符串的一种方法(也称为 ASCII 装甲)。它包含头部和尾部行(指定编码的数据类型,并在将数据链接在一起时显示开始/结束),而中间的数据是 base64 数据。如果它编码一个证书,则会简单地包含 DER 证书的 base64 编码。PEM 代表隐私增强邮件;邮件不能直接包含未编码的二进制值(如 DER)。
PEM 还可以编码/保护与证书相关的其他数据,如公钥/私钥、证书请求等。如果内容是普通的 X509v3 证书,则 PEM 编码为:
-----BEGIN CERTIFICATE-----
... base 64 encoding of the DER encoded certificate
with line endings and padding with equals signs ...
-----END CERTIFICATE-----
请注意,PEM文件也可能包含完整的证书链,其中链以服务的叶子/终端证书开始,后跟签署它的证书,通常是到但不包括受信任的根证书。因此,如果您缺少证书,您可能需要查看第一个证书后面的内容。
.cer
或.crt
扩展名.cer
只代表证书。它通常是DER编码数据,但Windows也可以接受PEM编码数据。您需要查看内容(例如,在posix系统上使用file
实用程序)才能确保文件中有什么。
请参阅此答案以获取OpenSSL支持的更广泛列表。
要使用证书中包含的公钥(并由证书中的签名签名),您应该使用解析X.509证书并执行RSA加密的任何库。您可以使用检测/处理PEM编码的工具,也可以通过剥离PEM编码来将证书首先转换为DER。
OpenSSL命令行包含大量选项,可在PEM和DER之间转换,打印高级证书信息或解析ASN.1以获得低级别的视图。
与大多数ASN.1结构一样,DER编码的证书始终以一个字节30
开头,该字节是ASN.1 SEQUENCE
的标签编码。如果您在文件中看到很多重复,则这是可以接受的;它只是严格定义的结构。
同样,在PEM编码的文件中,base 64始终以字母M
开头,因为ASN.1 SEQUENCE
以字节30
开头,因此第一个6位是001100
,将其转换为数字12,这是字母表的第13个字母M
的索引。
ASN.1,DER,PEM
文件扩展名并不重要
ASN.1 <-> DER <-> PEM
抽象语法表示法一(ASN.1)- 是用于描述数据结构的接口描述语言(IDL)。广泛应用于电信、网络和密码学领域。
可辨别编码规则(DER)- 二进制。是ASN.1的主要编码格式之一。它是基本编码规则(BER)的子集。广泛用于密码学。可以使用.der、.cer等文件扩展名。
增强隐私邮件(PEM)- base64编码的DER。块或块(例如证书链)的base-64,带有明文标题和页脚以标记开始和结束。主要用于密码学。很难传输二进制DER文件,例如支持ASCII的邮件。您会发现有许多带有PEM的文件扩展名,如.pem、.crt、.cer .key(用于公钥或私钥),但您不应依赖它。您应该打开此文件并检查标题/页脚。
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
公钥密码学标准#7:加密消息语法(PKCS#7: CMS)。它可以存储为DER或PAM格式。这是一个多用途的格式,可用于加密数据、认证数据或签名数据(除了私钥)。它可以包含带有证书链的附加或分离的签名。.p7b通常是PEM格式,.p7s是DER格式的签名文件。
公钥密码学标准#12:加密消息语法(PKCS #12: CMS)与PKCS#7相同,但包含私钥。
以PEM格式的PKCS#7
-----BEGIN PKCS7-----
...
-----END PKCS7-----
分离的PKCS#7签名示例
data.txt:
Hello, World!
//openssl req -x509 -newkey rsa:4096 -keyout <name_for_new_private_key> -out <name_for_new_certificate> -days 365
openssl req -x509 -newkey rsa:4096 -keyout myPrivateKey -out myCert -days 365
我的私钥采用PEM格式:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIJnzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQI9Qxgmq0oK+ICAggA
...
-----END ENCRYPTED PRIVATE KEY-----
我的证书采用PEM格式:
-----BEGIN CERTIFICATE-----
MIIFMjCCAxoCCQD3+UllOGhfkTANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJV
...
-----END CERTIFICATE-----
//openssl cms -sign -signer <cert_file> -inkey <private_key_file> -binary -in <data_file> -outform [DER, PEM] -out <name_for_new_signature>
openssl cms -sign -signer myCert -inkey myPrivateKey -binary -in data.txt -outform PEM -out dataSignature
-----BEGIN CMS-----
MIII/gYJKoZIhvcNAQcCoIII7zCCCOsCAQExDTALBglghkgBZQMEAgEwCwYJKoZI
...
-----END CMS-----
openssl cms -sign -signer myCert -inkey myPrivateKey -binary -in data.txt -outform DER -out dataSignature
3082 08fe 0609 2a86 4886 f70d 0107 02a0
...
//openssl cms -verify -binary -inform <PEM_or_DER_format_of_signature> -in <signature_file> -content <data_file> -noverify > /dev/null
//let's say that we generated signature in PEM format on previous step
openssl cms -verify -binary -inform PEM -in dataSignature -content data.txt -noverify > /dev/null
//Verification successful
//-noverify - Do not verify the signers certificate of a signed message
//-nointern - By default searching signing certificate inside. With this option only the certificates specified in the -certfile option are used.
您可以查看PKCS7
//openssl cms -cmsout -in <signature_file> -inform [PEM, DER] -noout -print
openssl cms -cmsout -in dataSignature -inform PEM -noout -print
CMS_ContentInfo:
contentType: pkcs7-signedData (1.2.840.113549.1.7.2)
d.signedData:
version: 1
digestAlgorithms:
algorithm: sha256 (2.16.840.1.101.3.4.2.1)
parameter: <ABSENT>
encapContentInfo:
eContentType: pkcs7-data (1.2.840.113549.1.7.1)
eContent: <ABSENT>
certificates:
d.certificate:
cert_info:
version: <ABSENT>
serialNumber: 17868393695656042385
...
ASN.1 看起来或使用 lapo.it
//openssl asn1parse -inform [PEM, DER] -i -in <(fold -w 64 <signature_file>)
openssl asn1parse -inform PEM -i -in dataSignature
//for PEM sometimes helps next command: openssl asn1parse -i -in dataSignature <(fold -w 64 dataSignature)
0:d=0 hl=4 l=2302 cons: SEQUENCE
4:d=1 hl=2 l= 9 prim: OBJECT :pkcs7-signedData
15:d=1 hl=4 l=2287 cons: cont [ 0 ]
19:d=2 hl=4 l=2283 cons: SEQUENCE
23:d=3 hl=2 l= 1 prim: INTEGER :01
26:d=3 hl=2 l= 13 cons: SET
28:d=4 hl=2 l= 11 cons: SEQUENCE
30:d=5 hl=2 l= 9 prim: OBJECT :sha256
41:d=3 hl=2 l= 11 cons: SEQUENCE
43:d=4 hl=2 l= 9 prim: OBJECT :pkcs7-data
54:d=3 hl=4 l=1334 cons: cont [ 0 ]
58:d=4 hl=4 l=1330 cons: SEQUENCE
62:d=5 hl=4 l= 794 cons: SEQUENCE
66:d=6 hl=2 l= 9 prim: INTEGER :F7F9496538685F91
77:d=6 hl=2 l= 13 cons: SEQUENCE
79:d=7 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption
...
cp
命令可能会起作用 :) - Maarten Bodewes