各类证书由于存储的内容不同(如是否包含公钥/私钥是否加密存储/单一证书或多证书等)、采用编码不同(DER/BASE64)、标准不同(如PEM/PKCS),所以尽管X.509标准规定了证书内容规范,但证书文件还是五花八门。
在实际应用中经常会要求进行证书格式转化,比如在配置VMware Operation Manager 和Identity Manager等Linux场景下的证书服务器时要求使用的是PEM编码格式的证书,但是很多人手上只有CER格式的证书。好在openssl对这些不同的标准都有着不错的支持,可以用来进行不同格式证书的转换。本文章将会以Identity Manager场景下的SSL格式转换为例进行演示讲解
证书导出
本环境中将会有企业内的CA证书颁发机构为其进行证书颁发,所以获取的证书格式为Windows易于识别的Cer或者pfx格式。首先我们将该证书导出
对于本环境的Identity Manager需要用到私钥,故此选择导出私钥
注:一般情况下需要用到pem格式的证书都需要导出和识别证书
勾选导出私钥后,文件格式只能选择pfx
设置密码
选择导出路径
导出完成
同时我们也要导出企业的根证书颁发机构的证书进行导出
根证书选择不导出私钥。注:将根证书颁发机构的证书导出是一件很危险的事情
证书格式我们选择“base64编码”
导出完成
至此我们已经获得一个服务器证书以及一个对应的根证书颁发机构的证书,接下来就可以通过openssl进行证书格式转换。
证书格式转换
在安装openssl前,请先在系统中安装 Microsoft Visual C++ 2008 Redistributable Package (x86)。要下载软件包,(下载地址:
https://www.microsoft.com/en-us/download/confirmation.aspx?id=29)
下载适用于OpenSSL x86 的 Shining Light Productions 安装程序,,下载网址为 Shining Light Productions。这是 OpenSSL Project 开发的软件。下载完成后点击安装,默认情况下其会安装在C盘根目录
通过cmd进入安装目录的bin目录
首先将pfx格式转换为pem格式
并通过以下命令将上述导出的证书转换成pem格式(不含私钥)
openssl pkcs12 -in c:\idm.pfx -clcerts -nokeys -out c:\idm.pem
(上述命令就是通过openssl将idm.pfx这个pkcs12格式的证书转换成pem格式,其中-nokeys为指定如无需导出私钥,命令中需要根据自己情况制定具体的证书位置)
接着通过命令将私钥也转换成pem格式,并且在转换输出过程中要求输入密码
openssl pkcs12 -in c:\idm.pfx -nocerts -out c:\idm.key.pem
(-nocerts为控制不转换证书 只转换私钥)
最后再通过命令将这个pem格式的私钥转换成rsa
打开C盘 可以看到其已经生成一个pem格式的证书以及pem格式的私钥
最后也要将根证书转换成pem格式
也就是实现从CER格式转化为PEM的过程命令如下
openssl.exe x509 -in c:\rootca.cer -out c:\rootca.pem
当然openssl除了可以实现pfx以及Cer向pem格式转换外, 还支持很多其他格式的转换,基本参考如下:
PEM--DER/CER(BASE64--DER编码的转换)
openssl x509 -outform der -in certificate.pem -out certificate.der
EM--P7B(PEM--PKCS#7)
openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
PEM--PFX(PEM--PKCS#12)
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
PEM--p12(PEM--PKCS#12)
openssl pkcs12 -export -out Cert.p12 -in Cert.pem -inkey key.pem
CER/DER--PEM(编码DER--BASE64)
openssl x509 -inform der -in certificate.cer -out certificate.pem
P7B--PEM(PKCS#7--PEM)
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
P7B--PFX(PKCS#7--PKCS#12)
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)
openssl pkcs12 -in certificate.pfx -out certificate.cer
如无需加密pem中私钥,可以添加选项-nodes;如无需导出私钥,可以添加选项-nokeys;
PEM BASE64--X.509文本格式
openssl x509 -in Key.pem -text -out Cert.pem
PFX文件中提取私钥(.key)
openssl pkcs12 -in mycert.pfx -nocerts -nodes -out mycert.key
PEM--SPC
openssl crl2pkcs7 -nocrl -certfile venus.pem -outform DER -out venus.spc
PEM--PVK(openssl 1.x开始支持)
openssl rsa -in mycert.pem -outform PVK -pvk-strong -out mypvk.pvk
PEM--PVK(对于openssl 1.x之前的版本,可以下载PVK转换器通过以下命令完成)
pvk -in ca.key -out ca.pvk -nocrypt -topvk