密钥和证书格式转换
私钥和证书可以以多种格式保存,所以你经常需要进行格式互转。常用格式如下:
二进制(DER)证书和密钥-Binary Certificate/Key
包含原始格式的X.509证书或密钥,使用DER ASN.1编码
ASCII(PEM)证书和密钥
包含base64编码的DER证书或密钥,以 -----BEGIN CERTIFICATE/KEY-----开头和 -----END CERTIFICATE/KEY-----结尾。通常一个文件包含一个证书。 有时会带有其他元数据(比如保护密码使用的算法)
PKCS#7证书
用户传输签名或者加密过的数据的一种复杂格式。在RFC2315中定义。通常后缀是.p7b,.p7c,可以包含整个证书链。java的keytools工具支持这个格式
PKCS#12(PFX)密钥和证书
通常后缀是.p12或者.pfx, 用来保存和保护服务器的密钥,包括整个证书链。是微软产品中使用的通用格式,也用于客户端证书。
PEM和DER互转
$ openssl x509 -inform PEM -in fd.pem -outform DER -out fd.der
$ openssl x509 -inform DER -in fd.der -outform PEM -out fd.pem
PEM和PFX互转
$ openssl pkcs12 -export \
-name "My Certificate" \
-out fd.p12 \
-inkey fd.key \
-in fd.crt \
-certfile fd-chain.crt
以上命令把密钥(fd.key),证书(fd.crt)和中间证书(fd-chain.crt)全部打包转成一个p12文件
$ openssl pkcs12 -in fd.p12 -out fd.pem -nodes
以上命令把所有的内容都输出成fd.pem, 你需要手动分离里面的不同内容(密钥,证书,证书链)
也可以通过分别调用openssl命令提取不同文件
$ openssl pkcs12 -in fd.p12 -nocerts -out fd.key -nodes
$ openssl pkcs12 -in fd.p12 -nokeys -clcerts -out fd.crt
$ openssl pkcs12 -in fd.p12 -nokeys -cacerts -out fd-chain.crt
PKCS#7和PEM互转
$ openssl crl2pkcs7 -nocrl -out fd.p7b -certfile fd.crt -certfile fd-chain.crt
$ openssl pkcs7 -in fd.p7b -print_certs -out fd.pem