使用 OpenSSL 实现私钥和证书的转换

原文地址:http://blog.52sox.com/use-ope...html

近期在项目中iOS须要用到APNs的推送,而公司的iOS女同事(纯哥)只给了我2个p12格式的文件。忽然发现,证书的转换问题仍是比较常见的,好比以前支付开发。而在程序中,实际须要使用的是pem格式的证书,所以这里涉及到证书之间的转换问题。
因为私钥和证书能够以不一样格式的存储,这意味着咱们须要对它们进行转换。而大多数经常使用的格式以下,首先是证书的格式:node

  • 二进制的DER证书,包含X.509证书为原始格式,使用DER ASN.1编码。算法

  • ASCII的PEM证书,包含1个base64编码的DER证书,以-----BEGIN CERTIFICATE-----开头而以-----END CERTIFICATE-----结束。服务器

  • PKCS#7证书,1个复杂格式的设计用于传输签名或加密数据,定义在RFC 2315中。一般以.p7b.p7c做为后缀且能够包含整个证书链。这种格式被Java的keytool工具支持。编辑器

  • PKCS#12(PFX)的证书和私钥,1个复杂的格式它能够存储和保护1个服务器的私钥并和1个完整的证书链一块儿。它一般以.p12.pfx为后缀。这种格式经常使用于微软的产品,不过也能够用于客户端证书。工具

而后是对应的私钥的格式:编码

  • 二进制的DER私钥,包含1个私钥以原始形式,使用DER ASN.1编码。OpenSSL以它传统的SSLeay格式建立私钥,不过也可使用另外1种称为PKCS#8,但不普遍使用的格式(定义在RFC 5208)。在OpenSSL中可使用pkcs8命令来进行PKCS#8格式的处理操做。加密

  • ASCII格式的私钥,包含1个base64编码的DER私钥,有些时候有一些额外的元信息,例如密码保护采用的算法。设计

说了这么多,能够发现对于私钥之间的转换就简单的不少,只能在DER和PEM格式之间进行转换。而相比证书之间的转换,就稍微复杂一些。
若是有兴趣还能够查看个人另外一篇文章PKI格式标准查看其概念。
在这里,咱们须要将PKCS#12格式的文件中提取出私钥和证书。下面咱们先从PEM和DER格式的转换开始:code

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转换

咱们可使用OpenSSL提供的pkcs12命令来实现PKCS#12格式的操做,首先咱们将证书和私钥导出为PEM格式:

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

能够看到,在这里咱们多添加了1个-nocerts的参数就作到了不导出证书的操做。那么不导出私钥的操做应该以下:

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:

其中,-name选项指定了证书中的friendlyName,而-certfile指定信任链的文件名称。
最后,咱们还能够经过-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个文件中便可。

参考文章:

https://www.feistyduck.com/li...
http://juliusdavies.ca/common...
https://superuser.com/questio...

相关文章
相关标签/搜索