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

近期在项目中iOS需要用到APNs的推送,而公司的iOS女同事(纯哥)只给了我2个p12格式的文件。突然发现,证书的转换问题还是比较常见的,比如之前支付开发。而在程序中,实际需要使用的是pem格式的证书,因此这里涉及到证书之间的转换问题。

由于私钥和证书可以以不同格式的存储,这意味着我们需要对它们进行转换。而大多数常用的格式如下,首先是证书的格式:

  • 二进制的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格式的转换开始:

PEM和DER转换

PEM和DER格式证书的转换可以通过OpenSSL提供的x509工具来完成。下面我们转换1个DER格式的证书为PEM:


  1. sky@sky-pc:~$ openssl x509 -inform DER -in private_key.der -outform PEM -out private_key.pem 

在这里,我们通过-inform参数指定输入的格式为DER,通过-in参数指定输入的文件名称,而后对应的-outform和-out用于指定输出的格式及文件名称。

同样的,我们也可以将PEM格式的整数转换为DER格式:


  1. 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格式:


  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -out key.pem -nodes 
  2. Enter Import Password: 
  3. MAC verified OK  

在这里,我们通过-in参数指定传入的文件名称,而-out文件指定输出的文件名称,而-nodes参数表示不对私钥进行加密。在这个过程中,我们需要输入签名时的密码。

如果我们不添加-nodes参数,将是如下的结果:


  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -out key.pem 
  2. Enter Import Password: 
  3. MAC verified OK 
  4. Enter PEM pass phrase: 
  5. Verifying - Enter PEM pass phrase:  

可以看到,验证签名成功后还需要我们重新输入新的加密口令。而在导出的文件中可以看到此时文件的内容为:


  1. ... 
  2. -----BEGIN ENCRYPTED PRIVATE KEY----- 
  3. MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIPdUUocbjDXUCAggA 
  4. ... 
  5. -----END ENCRYPTED PRIVATE KEY-----  

而添加-nodes后的结果为:


  1. ... 
  2. -----BEGIN PRIVATE KEY----- 
  3. MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC+QDKKakQ0fcvH 
  4. ... 
  5. -----END PRIVATE KEY-----  

之后,我们就可以使用编辑器打开输出的key.pem文件,手动的拆分它们为独立的私钥、证书和中间证书文件。

作为程序猿,一般人都是懒惰的,这个繁琐的操作能不能简便些呢,让机器自己去完成呢?

其实是可以做到的,在OpenSSL中提供这样的操作,我们先来看看不导出证书的操作,这样我们就可以得到私钥了:


  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -nocerts -out private_key.pem -nodes 
  2. Enter Import Password: 
  3. MAC verified OK  

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


  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -nokeys -out cert.pem -nodes 
  2.  
  3. Enter Import Password: 
  4.  
  5. MAC verified OK  

接下来,我们该如何将PEM格式的证书和私钥导出为PKCS#12格式呢,我们可以这样来操作:


  1. sky@sky-pc:~$ openssl pkcs12 -name "My Certificate" -export -out fd.p12 -inkey key.pem -in cert.pem -certfile fd-chain.crt 
  2.  
  3. Enter Export Password: 
  4.  
  5. Verifying - Enter Export Password:  

其中,-name选项指定了证书中的friendlyName,而-certfile指定信任链的文件名称。

最后,我们还可以通过-clcerts和-cacerts选项指定是否只导出客户端及CA证书。

PKCS#7转换

为了转换PEM为PKCS#7,我们可以使用crl2pkcs7命令。


  1. sky@sky-pc:~$ openssl crl2pkcs7 -nocrl -out key.p7b -certfile cert.pem -certfile fd-chain.crt 

那么,生成的文件头部将以-----BEGIN PKCS7-----开始。

最后,为了转换PKCS#7为PEM,我们可以使用pkcs7命令:


  1. sky@sky-pc:~$ openssl pkcs7 -in key.p7b -print_certs -out key1.pem 

在这里,我们使用-print_certs参数将输入的证书输出。

PKCS#8与SSLeay转换

如果我们想将PKCS#8格式的私钥转换为SSLeay格式,我们可以这样来操作:


  1. sky@sky-pc:~$ openssl rsa -in key.pem -out ssleay.pem 
  2.  
  3. writing RSA key  

而此时文件的内容将如下所示:


  1. -----BEGIN RSA PRIVATE KEY----- 
  2.  
  3. MIIEpQIBAAKCAQEAvkAyimpENH3Lx4d8VH96XCYfKfCZ7qVtNuVseAvkSTC0q5dw 
  4.  
  5. ... 
  6.  
  7. -----END RSA PRIVATE KEY-----  

可以看到头部和尾部多追加了RSA的字样。

而如果要将传统的SSLeay私钥转换为PKCS#格式,我们需要使用pkcs8命令:


  1. sky@sky-pc:~$ openssl pkcs8 -topk8 -in ssleay.pem -out pkcs8_key.pem 
  2.  
  3. Enter Encryption Password: 
  4.  
  5. Verifying - Enter Encryption Password:  

默认情况下,会为该格式进行1个加密的处理,但是我们可以通过-nocrypt参数让其不进行加密处理:


  1. sky@sky-pc:~$ openssl pkcs8 -topk8 -nocrypt -in ssleay.pem -out pkcs8_key.pem 

可以我们便实现了将传统的SSLeay格式转换为PKCS#8格式了。

APNs中证书的生成

下面我们来生成APNs推送时需要的证书。


  1. sky@sky-pc:~$ openssl pkcs12 -in cer.p12 -clcerts -nokeys -out cert.pem -nodes 
  2. Enter Import Password: 
  3. MAC verified OK 
  4. sky@sky-pc:~$ openssl pkcs12 -in cer.p12 -nocerts -out key.pem -nodes 
  5. Enter Import Password: 
  6. MAC verified OK 
  7. sky@sky-pc:~$ cat cert.pem key.pem > certs.pem  

我们先只导出客户端的证书,然后是私钥,最后我们将2个文件的内容合并在1个文件中即可。

作者:我勒个去

来源:51CTO

时间: 2024-09-20 21:11:41

使用OpenSSL实现私钥和证书的转换的相关文章

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

近期在项目中iOS需要用到APNs的推送,而公司的iOS女同事(纯哥)只给了我2个p12格式的文件.突然发现,证书的转换问题还是比较常见的,比如之前支付开发.而在程序中,实际需要使用的是pem格式的证书,因此这里涉及到证书之间的转换问题. 由于私钥和证书可以以不同格式的存储,这意味着我们需要对它们进行转换.而大多数常用的格式如下,首先是证书的格式: 二进制的DER证书,包含X.509证书为原始格式,使用DER ASN.1编码. ASCII的PEM证书,包含1个base64编码的DER证书,以--

OpenSSL 与 SSL 数字证书概念贴

SSL/TLS 介绍见文章 SSL/TLS原理详解. 如果你想快速自建CA然后签发数字证书,请移步 基于OpenSSL自建CA和颁发SSL证书 . 首先简单区分一下HTTPS.SSL.OpenSSL三者的关系: SSL是在客户端和服务器之间建立一条SSL安全通道的安全协议,而OpenSSL是TLS/SSL协议的开源实现,提供开发库和命令行程序.常说的HTTPS是HTTP的加密版,底层使用的加密协议是SSL. 1. PKI.CA与证书 PKI 就是 Public Key Infrastructur

X509证书格式转换

问题描述 有哪位高手能将.crt格式转换成.cer格式的.急用啊.最好是在c++代码中转换或者直接生成.cer格式的证书,已经能生成.crt格式的证书 解决方案 解决方案二:该回复于2012-06-02 09:40:35被版主删除解决方案三:你crt格式的证书怎么生成的啊!解决方案四:我建议你先读下这篇关于证书文件扩展名/后缀名的文章:读完之后你应该明白,.crt与.cer这两个扩展名其实与文件本身的编码方式无关,在文件编码方式不变的情况下,只需改个扩展名即可.真正需要转换的是.pem与.der

请教!!!openssl生成.cer格式证书文件问题

问题描述 今日任务需要解析ssl证书,看到openssl提供的接口都是需要用.cer格式的文件来进行解析.但是我需要解析的证书是从libpacp抓包工具抓下来的数据包,证书的结构都是网络上的直接抓下来的格式,不知道如何转换成.cer文件的格式.熟悉opensll的高手指点一下,多谢了 解决方案 解决方案二:就是openssl貌似只提供了解码DER编码的数字证书和解码pem编码的数字证书,我想知道如何把抓下来的数据包里的原始格式转换成另外两种.解决方案三:数据包的原始格式是怎么样的呀,这个只有你自

openssl与数字证书的使用

Openssl与数字证书的使用详解 数字证书这个概念大家应该并不陌生,比如我们在利用Nginx提供https服务的时候需要我们去CA申请一 个包含我们的公钥信息.身份信息.数字签名的证书,再比如我们在使用银行的U盾的时候也是在客户机器上安装了用户的数字证书,数字证书就好像我们的电子身份证一样,是对我们身份的唯一标识, 并且数字证书和身份证一样是有期限的,过期之后需要重新申请,上面所说的CA其实是一家第三方值得信赖的机构,我们的数字证书和数字签名均由该机构颁发,例如 Verisign.Thawte

使用OpenSSL实现证书操作

伴随着计算机的发展,计算机的安全问题也一直困扰着我们,在现代社会计算机信息安全更显得格外的重要,如今的社会是一个信息的社会,你我每天都在使用计算机,随着电子邮件.社区网游.即使通讯.电子商务等应用的发展,我们的私人信息也在通过各种网络设备在互联网上被传递,如何才能保障这些私人信息的安全是我们所要关心的. 对重要的数据如银行帐号我们可以使用加密技术加密我们的数据,然后再通过网络传递这些信息,现代加密技术通常被分为:对称加密技术和对对称加密技术. 其中对称加密技术的特点是: 1.加密与解密使用的是同

基于OpenSSL自建CA和颁发SSL证书

关于SSL/TLS介绍见文章 SSL/TLS原理详解. 关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库:二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能:三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书.吊销证书. 默认情况ubuntu和

openssl访问https,怎么获取证书

问题描述 比如访问QQ邮箱:https://mail.qq.com/怎么获取它的证书,浏览器有个复制证书,复制后是.cer的,openssl能用吗,谢谢给个关键代码.. 解决方案 解决方案二:要不换个方法,,,不使用证书openssl怎么建立连接..解决方案三:如果网站是https的,必须使用openssl建立安全通道,也就是必须要用证书..cer是证书的常用后缀,一般是asn.1编码的,openssl中有相关解析证书接口,链接:http://blog.csdn.net/wanjie518/ar

openssl 证书请求和自签名命令 req 详解

openssl 证书请求和自签名命令 req 详解 1.密钥.证书请求.证书概要说明 在证书申请签发过程中,客户端涉及到密钥.证书请求.证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水.我们以申请证书的流程说明三者的关系.客户端(相对于CA)在申请证书的时候,大体上有三个步骤: 第一步:生成客户端的密钥,即客户端的公私钥对,且要保证私钥只有客户端自己拥有. 第二步:以客户端的密钥和客户端自身的信息(国家.机构.域名.邮箱等)为输入,生成证书请求文件.其