原文链接
OpenSSL支持几种不同的证书格式。这些证书都是基于DSA或者RSA算法,并被用于公钥加密。
证书的格式取决于它们的应用,因为现在还没有一个证书文件格式的标准。
私钥(Private Key)通常以PEM和DER编码格式出现。相关的文件看起来是下面这样的:
*key-rsa.pem
pem文件
*key-rsa.der
der文件
对于OpenSSL的应用,PEM编码就够用了。对于Java应用,DER编码可能更适合用来导入私钥和证书。
对于数字证书(Certificate),可用的格式有PEM、DER和PKCS12:
*cert.pem
pem文件
*cert.der
der文件
*cert.p12
pkcs12文件
通常,PEM编码用于Unix系统,PKCS12用于微软,而DER用于Java。
数字证书是由ASN.1编码的对象组成的。这些对象可用通过DES(Data Encryption Standard)来加密,也可用通过其他的对称加密算法来加密,例如3DES。
未加密的PEM文件内容看起来是下面这个样子的:
-----BEGIN CERTIFICATE----- MB4CGQDUoLoCULb9LsYm5+/WN992xxbiLQlEuIsCAQM= -----END CERTIFICATE-----以 MB4C... 的字符串是一个Base64编码(Base64-encoded)、
ASN.1
编码(ASN.1-
encoded)的对象。
加密后的文件有一些header来描述加密类型和初始向量:
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,C814158661DC1449 AFAZFbnQNrGjZJ/ZemdVSoZa3HWujxZuvBHzHNoesxeyqqidFvnydA== -----END RSA PRIVATE KEY-----
Proc-Type和
DEK-Info
声明了加密算法, 以
AFAZ...
开头的字符串是一个Base64编码(Base64-encoded)、
ASN.1
编码(ASN.1-
encoded)的对象。
由于网页浏览器会使用Java应用程序,浏览器会以pkcs12格式导入/导出数字证书,即公钥和私钥会被用PKCS#12算法打包在一个文件中。其他应用程序会要求未打包的PEM编码的公钥和私钥,因此用户必须记住应用程序需要的适当的格式,并在必要的时候进行格式转换。