.pem、.cer和.der之间有什么区别?

156

什么是 .pem.cer.der 的区别?

据我所知,.cer 包含公钥。是否有任何开源框架可以使用该公钥加密数据?


2
我认为它们都只是可以存储任何键的文件格式,有一些工具可以自由地在它们之间进行转换。 - IMSoP
1
@IMSoP 你说得对,但是对于 .cer 到 .der 的转换,cp 命令可能会起作用 :) - Maarten Bodewes
2个回答

196

.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格式

请参阅此答案以获取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的索引。


请问您能否在这个上下文中详细解释一下“ASCII装甲”是指什么? - Marian Paździoch
“...或者一个CMS容器”,这里的CMS代表什么? - Marian Paździoch
加密消息语法。它是在您接收加密邮件时的基础协议(例如集成到Outlook等电子邮件客户端,而不是PGP),使用标准PKIX(即X.509证书和其私钥)进行保护。 - Maarten Bodewes

6

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!
  1. 创建私钥和自签名证书,填写如下字段:私钥的密码短语以及证书的相关信息
//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-----

使用您的私钥短语对 data.txt 进行签名。
//openssl cms -sign -signer <cert_file> -inkey <private_key_file> -binary -in <data_file> -outform [DER, PEM] -out <name_for_new_signature>

生成PEM格式的数据签名。
openssl cms -sign -signer myCert -inkey myPrivateKey -binary -in data.txt -outform PEM -out dataSignature

-----BEGIN CMS-----
MIII/gYJKoZIhvcNAQcCoIII7zCCCOsCAQExDTALBglghkgBZQMEAgEwCwYJKoZI
...
-----END CMS-----

生成 DER 格式的数据签名。
openssl cms -sign -signer myCert -inkey myPrivateKey -binary -in data.txt -outform DER -out dataSignature

3082 08fe 0609 2a86 4886 f70d 0107 02a0
...
  1. 验证签名
//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
...

[签名, 证书]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接