
使用OpenSSL实现私钥和证书的转换
我勒个去 segmentfault 2016-09-06

近期在项目中iOS需要用到APNs的推送,而公司的iOS女同事(纯哥)只给了我2个p12格式的文件。突然发现,证书的转换问题还是比较常见的,比如之前支付开发。而在程序中,实际需要使用的是pem格式的证书,因此这里涉及到证书之间的转换问题openssl证书转换工具。
由于私钥和证书可以以不同格式的存储,这意味着我们需要对它们进行转换。而大多数常用的格式如下,首先是证书的格式:
然后是对应的私钥的格式:
这是mp3格式转换器绿色版下载,mp3格式转换器是一个mp3,wma,wav,ogg mp3转换工具,可以在mp3,wma,wav,ogg四种格式之间相互转换。蒲公英视频格式工厂是一款的的功能全面的视频或音频格式转换工具,软件可以帮助您在各种流行视频格式之间相互转换,比如可以在avi, wmv, vcd, svcd, dvd, vob, mov, mp4, 3gp, mts, flv, mpeg, swf等几十种格式视频之间相互转换。《蒲公英视频格式工厂》是一款的的功能全面的视频或音频格式转换工具,软件可以帮助您在各种流行视频格式之间相互转换,比如可以在avi, wmv, vcd, svcd, dvd, vob, mov, mp4, 3gp, mts, flv, mpeg, swf等几十种格式视频之间相互转换。
如果有兴趣还可以查看我的另一篇文章PKI格式标准查看其概念。
在这里,我们需要将PKCS#12格式的文件中提取出私钥和证书。下面我们先从PEM和DER格式的转换开始:
PEM和DER转换
PEM和DER格式证书的转换可以通过OpenSSL提供的x509工具来完成。下面我们转换1个DER格式的证书为PEM:

- sky@sky-pc:~$ openssl x509 -inform DER -in private_key.der -outform PEM -out private_key.pem
在这里,我们通过-inform参数指定输入的格式为DER,通过-in参数指定输入的文件名称,而后对应的-outform和-out用于指定输出的格式及文件名称。
同样的,我们也可以将PEM格式的整数转换为DER格式:
- sky@sky-pc:~$ openssl x509 -inform PEM -in private_key.pem -outform DER -out private_key.der
下面我们来看下如何从PKCS#12格式中提取出私钥和证书。
PKCS#12转换
十一.导入、导出eil图片组文件图片组源文件是gif格式,或bmp格式,如果存入了图片组中,就变成了eil格式,大家可以导出这个eil格式,好处是以后可以直接导入这个文件,或合并eil文件,方便操作,或在编程中使用命令动态导入图片组。步骤十:按照证书导出向导的指示将证书及相关的私钥以pfx文件格式导出(注意:推荐使用“导出私钥”方式导出,这样可以保证证书受密码保护,以防别人盗用。选择该证书,右键,选择 导出xxxxx, 准备从系统钥匙串中导出证书(内含私钥)到p12格式文件.。
- sky@sky-pc:~$ openssl pkcs12 -in key.p12 -out key.pem -nodes
- Enter Import Password:
- MAC verified OK
在这里,我们通过-in参数指定传入的文件名称,而-out文件指定输出的文件名称,而-nodes参数表示不对私钥进行加密。在这个过程中,我们需要输入签名时的密码。
如果我们不添加-nodes参数,将是如下的结果:
- sky@sky-pc:~$ openssl pkcs12 -in key.p12 -out key.pem
- Enter Import Password:
- MAC verified OK
- Enter PEM pass phrase:
- Verifying - Enter PEM pass phrase:

可以看到,验证签名成功后还需要我们重新输入新的加密口令。而在导出的文件中可以看到此时文件的内容为:
- ...
- -----BEGIN ENCRYPTED PRIVATE KEY-----
- MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIPdUUocbjDXUCAggA
- ...
- -----END ENCRYPTED PRIVATE KEY-----
而添加-nodes后的结果为:
- ...
- -----BEGIN PRIVATE KEY-----
- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC+QDKKakQ0fcvH
- ...
- -----END PRIVATE KEY-----
之后,我们就可以使用编辑器打开输出的key.pem文件,手动的拆分它们为独立的私钥、证书和中间证书文件。
作为程序猿,一般人都是懒惰的,这个繁琐的操作能不能简便些呢,让机器自己去完成呢?
其实是可以做到的,在OpenSSL中提供这样的操作,我们先来看看不导出证书的操作,这样我们就可以得到私钥了:
- sky@sky-pc:~$ openssl pkcs12 -in key.p12 -nocerts -out private_key.pem -nodes
- Enter Import Password:
- MAC verified OK
4、ie提示是否导出证书私钥,应选择“是,导出私钥”。-r-证书存储位置,-sv 导出私钥文件(为了签名使用)。点击交易申请证书,获取到证书之后,需要将证书的上传回商户后台,同时本地需要导出证书私钥(带密码),以备用。
- sky@sky-pc:~$ openssl pkcs12 -in key.p12 -nokeys -out cert.pem -nodes
- Enter Import Password:
- MAC verified OK
接下来,我们该如何将PEM格式的证书和私钥导出为PKCS#12格式呢,我们可以这样来操作:

- sky@sky-pc:~$ openssl pkcs12 -name "My Certificate" -export -out fd.p12 -inkey key.pem -in cert.pem -certfile fd-chain.crt
- Enter Export Password:
- Verifying - Enter Export Password:
随着pdf文件的越来越广泛,pdf文件转换器也随之兴盛起来,今天小编要给大家讲的不是转换软件,而是转换工具,所谓的转换工具就是无需下载,直接在网页上就可以实现转换。现在大家对pdf格式的文件并不陌生,因为现在pdf文件在办公室人员当中已经非常的普及了,而且现在收发的文件也都是pdf文件,因此,大家手中一定有很多的pdf办公软件,那么为了方便,大家就会想到pdf文件转换,下面小编就来为大家介绍一款好用的pdf转换器——迅捷转换。而且,不同于普通的转换工具,该pdf转换成word转换器能够实现多种不同文件格式的转换,进一步满足了更多不同用户的需求。
最后,我们还可以通过-clcerts和-cacerts选项指定是否只导出客户端及CA证书。
PKCS#7转换
为了转换PEM为PKCS#7,我们可以使用crl2pkcs7命令。
- sky@sky-pc:~$ openssl crl2pkcs7 -nocrl -out key.p7b -certfile cert.pem -certfile fd-chain.crt
那么,生成的文件头部将以-----BEGIN PKCS7-----开始。
最后,为了转换PKCS#7为PEM,我们可以使用pkcs7命令:
- sky@sky-pc:~$ openssl pkcs7 -in key.p7b -print_certs -out key1.pem
在这里,我们使用-print_certs参数将输入的证书输出。
PKCS#8与SSLeay转换

如果我们想将PKCS#8格式的私钥转换为SSLeay格式,我们可以这样来操作:
- sky@sky-pc:~$ openssl rsa -in key.pem -out ssleay.pem
- writing RSA key
而此时文件的内容将如下所示:
- -----BEGIN RSA PRIVATE KEY-----
- MIIEpQIBAAKCAQEAvkAyimpENH3Lx4d8VH96XCYfKfCZ7qVtNuVseAvkSTC0q5dw
- ...
- -----END RSA PRIVATE KEY-----
可以看到头部和尾部多追加了RSA的字样。
而如果要将传统的SSLeay私钥转换为PKCS#格式,我们需要使用pkcs8命令:
- sky@sky-pc:~$ openssl pkcs8 -topk8 -in ssleay.pem -out pkcs8_key.pem
- Enter Encryption Password:
- Verifying - Enter Encryption Password:
默认情况下,会为该格式进行1个加密的处理,但是我们可以通过-nocrypt参数让其不进行加密处理:
- sky@sky-pc:~$ openssl pkcs8 -topk8 -nocrypt -in ssleay.pem -out pkcs8_key.pem
可以我们便实现了将传统的SSLeay格式转换为PKCS#8格式了。
APNs中证书的生成
下面我们来生成APNs推送时需要的证书。
- sky@sky-pc:~$ openssl pkcs12 -in cer.p12 -clcerts -nokeys -out cert.pem -nodes
- Enter Import Password:
- MAC verified OK
- sky@sky-pc:~$ openssl pkcs12 -in cer.p12 -nocerts -out key.pem -nodes
- Enter Import Password:
- MAC verified OK
- sky@sky-pc:~$ cat cert.pem key.pem > certs.pem
我们先只导出客户端的证书,然后是私钥,最后我们将2个文件的内容合并在1个文件中即可。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-100911-1.html
因此
该忍还是得忍