各类证书由于存储的内容不同(如是否包含公钥/私钥是否加密存储/单一证书或多证书等)、采用编码不同(DER/BASE64)、标准不同(如PEM/PKCS),所以尽管X.509标准规定了证书内容规范,但证书文件还是五花八门。好在openssl对这些不同的标准都有着不错的支持,可以用来进行不同格式证书的转换。
在部署HTTPS证书时,不同的服务器我们需要用到不同格式的证书文件,常见的证书文件格式有以下几种:
- PEM
- 适用于Apache、Nginx、Candy Server等Web服务器
- 常见的文件后缀为.pem、.crt、.cer、.key
- 可以存放证书或私钥,或者两者都包含
- .key后缀一般只用于证书私钥文件
- PFX
- 适用于IIS等Web服务器
- 常见的文件后缀为.pfx、.p12
- 同时包含证书和私钥,且一般有密码保护
- JKS
- 适用于Tomcat、Weblogic、JBoss、Jetty等Web服务器
- 常见的文件后缀为.jks
Let’s Encrypt颁发的HTTPS证书一般包括以下几个文件:
- cert.key(PEM格式):私钥文件
- cert.cer(PEM格式):证书文件
- fullchain.cer(PEM格式):包含证书和中间证书
PEM转DER/CER
(BASE64–DER编码的转换)
1
| openssl x509 -outform der -in certificate.pem -out certificate.der
|
PEM转P7B(PEM转PKCS#7)
1
| openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
|
PEM转PFX(PEM转PKCS#12)
1
| openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
|
PEM转p12(PEM转PKCS#12)
1
| openssl pkcs12 -export -out Cert.p12 -in Cert.pem -inkey key.pem
|
CER/DER转PEM
(编码DER–BASE64)
1
| openssl x509 -inform der -in certificate.cer -out certificate.pem
|
P7B转PEM(PKCS#7转PEM)
1
| openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
|
P7B转PFX(PKCS#7转PKCS#12)
1 2
| openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer
|
PFX/p12转PEM(PKCS#12转PEM)
1
| openssl pkcs12 -in certificate.pfx -out certificate.cer
|
如无需加密pem中私钥,可以添加选项-nodes;
如无需导出私钥,可以添加选项-nokeys;
PEM BASE64转X.509文本格式
1
| openssl x509 -in Key.pem -text -out Cert.pem
|
PFX文件中提取私钥(.key)
1
| openssl pkcs12 -in mycert.pfx -nocerts -nodes -out mycert.key
|
PEM转SPC
1
| openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
|
PEM转PVK
(openssl 1.x开始支持)
1
| openssl rsa -in mycert.pem -outform PVK -pvk-strong -out mypvk.pvk
|
PEM转PVK
对于openssl 1.x之前的版本,可以下载pvk转换器后通过以下命令完成)
1
| pvk -in ca.key -out ca.pvk -nocrypt -topvk
|
CRT转CER
1
| openssl x509 -in ca.crt -out server.cer -outform der
|
CER转CRT
1
| openssl x509 -inform PEM -in certificate.cer -out certificate.crt
|
PEM转PFX
- 工具:openssl
- 命令:使用cert.key和fullchain.cer文件生成cert.pfx
1
| openssl pkcs12 -export -out cert.pfx -inkey cert.key -in fullchain.cer
|
PFX转JKS
- 工具:keytool
- 命令:使用cert.pfx生成cert.jks
1
| keytool -importkeystore -srckeystore cert.pfx -destkeystore cert.jks -srcstoretype PKCS12 -deststoretype JKS
|
PEM转JKS
- 需要使用上面的两个方法,先将PEM文件转换为PFX文件,然后再将PFX文件转换为JKS文件
PFX转PEM
- 工具:openssl
- 命令1:使用cert.pfx文件生成临时文件temp.cer,temp.cer中包含了证书和私钥
1
| openssl pkcs12 -in cert.pfx -nodes -out temp.cer
|
- 命令2:使用临时文件temp.cer文件生成私钥文件cert.key
1
| openssl rsa -in temp.cer -out cert.key
|
- 命令3:使用临时文件temp.cer文件生成证书文件cert.cer
1
| openssl x509 -in temp.cer -out cert.cer
|
- 命令4:使用cert.pfx生成中间证书文件chain.cer,合并cert.cer、空白行、chain.cer即可得到fullchain.cer
1 2 3
| openssl pkcs12 -in cert.pfx -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > chain.cer echo '\n' > emptyline.cer cat cert.cer emptyline.cer chain.cer> fullchain.cer
|
JKS转PFX
- 工具:keytool
- 命令:使用cert.jks生成cert.pfx
- 如果安装过jdk,那么已经有keytool命令了
- keytool常用命令
![]()
1
| keytool -importkeystore -srckeystore cert.jks -destkeystore cert.pfx -srcstoretype JKS -deststoretype PKCS12
|
PFX转CER
1
| openssl pkcs12 -nodes -nokeys -in 1.pfx -passin pass:证书密码 -out 1.cer
|