如何将数字证书从一种文件格式转换成另一种,让我们来看看吧。


今天,我们将讲一些有些技术含量的问题,谈论如何将证书转换成正确的格式。尽管我们之前谈论过SSL证书的文件格式转换事宜,但是还是有很多人在问我们这一问题,而且我想要花一点时间来进行稍微深入一点的探讨。


这也意味着解决这一过程中不可避免的会出现的一些问题,比如我为什么不能使用转换器工具?以及什么是OpenSSL?


一旦我们解开了一切,这一问题就不会感觉那么艰巨了。因此,如果你准备好了学习如何将证书转换成正确的格式…...


让我们开始吧。


我为什么需要知道如何将证书转换成正确的格式?


在我们谈论如何将证书转换成正确的格式之前,让我们首先从这意味着什么开始。我们经常使用的服务器类型有几十种,然而,不幸的是,并没有一种统一标准的文件类型。如果这让你感到烦恼,而你又是一个美国人的话,现在你就知道了,当必须把文件的公制单位转换成美国常用单位时,世界上其他国家的人是什么感受了,因为我们认为不以10为单位来计算的话更有运动精神。


无论如何,服务器类型的这一多样性已经导致人们在使用多种不同文件格式的数字证书。现在,它们不全都是X.509证书吗?——你可能会这样问。嗯,是的。如果你想要我们这样做,我们可以写一整篇有关这一话题的文章,探讨Abstract Syntax Notatio和字节数组,但是,我有一种感觉,这篇文章的信息量会非常大,比你想象的还要多。因此,让我们概括一下吧:X.509证书是数字证书的一种类型,它使用了PKI(X.509 v3)来验证服务器是相关公有密钥的合法所有人。当你看到如下所示的扩展时:


  • .der 


  • .pem 


  • .crt .cer 


  • .pkcs7 


  • .p7b 


  • .pkcs8 


  • .pkcs12 


  • .pfx .p12


这些指代的是证书是如何编码以及呈现的。因为没有一个更有说服力的定义,所以基本上,编码是将数据编程成可以为另一个系统所使用的格式。或者,更简单地来说,对数据进行编码,因此,计算机就可以读取和使用它。最常见的编码标准之一是ASCII或美国信息互换标准代码(一种比我们的测量系统更普遍存在的标准),这是一种用于包含文本的文件的编码方案。


现在,让我们来谈论一下编码样式。


  • .der—代表可区别编码规则,打开看是二进制编码格式。Windows会把这些看作是证书文件,并且实际上会将证书以.der格式文件导出,但是这一过程使用的是像.crt或.cer这样的扩展。


  • .pem—代表保密邮件,考虑到PEM基本上不能是实现本身功能,但却被证明在作为容器格式方面是很有用的,这是很有趣的。PEM文件是Base64编码后的DER文件。


我可以看到你脸上流露出来的困惑的表情,因此让我来进一步解释一下吧。


DER文件是以二进制——1和0——形式编码的X.509数字证书。Base64是一种二进制到文本的编码方案,因此PEM(一种Base64编码后的DER文件)也是这个相同的X.509证书,但是是在文本中编码的,而这个文本(记住!)是用ASCII码表示的。


现在,你弄懂一点了吗?


好的,让我们继续。


DER文件很少在Windows之外使用,因此我们将不再使用它们。还记得我们说过PEM是一个容器吗?这是因为它可以包含任何内容,无论是数字证书本身,还是整个证书链和密钥对。不幸的是,并不是所有的浏览器都会将扩展名为.pem的文件识别为证书,所以很多时候,在PEM文件(也是DER文件)的末尾你会看到一个不同的扩展名:


  • .cert


  • .crt


  • .cer


因此,讨论如何将证书转换为正确的格式,也就是讨论如何对它进行编码或进行表示。现在,除了PEM和DER之外,还有其他一些表示证书的方法。PKCS,或公钥加密标准,通常你可以看到PKCS 7、PKCS8和PKCS12。让我们从PKCS7开始,它最初是由公司RSA定义的,之后被移交给了IETF。它是一种多用途的格式,可以用于加密和签名数据的传播。它最终演变为了加密消息语法标准,但是就像SSL和TLS一样,PKCS7是我们仍旧在口头上所使用的名称。它是一个开放的标准,由Windows支持。但是需要注意的一点是,它不能包含私钥。PKCS7经常与电子邮件证书一起使用,并形成了S/MIME安全电子邮件的基础。


PKCS8是一个类似的标准,用于携带私钥。最后是PKCS12,它通过加密提供了更好的安全性。与PEM文件非常类似,它也可以包含一切事物,无论是单个证书,还是整个证书链和密钥对,但是,与PEM不同的是,它是一个完全加密的、有密码保护的容器。如果在生成SSL证书时,系统提示你输入密码,而且它又是PKCS12格式的,则可以使用它打开该证书。


如果只用一个工具,要做到这一点不是更容易吗?


绝对的。它的风险也会大得多。虽然一般来说,我们认为你可以信任所有拥有这种工具的网站,但是将你的数字证书上传到除你自己的服务器之外的任何地方通常是不明智的。我这里所指的是,不要使用在线工具来将数字证书转换成不同的文件格式。使用OpenSSL命令在你自己的服务器上进行。


这就引出了下一个不可避免的问题……


什么是OpenSSL?


OpenSSL是一个软件库。计算机并不是生来就知道如何做。你必须教它。软件库是代码、脚本、配置和程序的一个集合,它可以帮助利用给定的函数。例如,如果你正在编写一款需要大量数学计算的软件,那么只需要添加一个数学软件库就可以了,这样你就不必自己再编写一大堆复杂的数学函数了。


现在将这个概念应用于SSL。OpenSSL是一个软件库,在几乎所有服务器上都支持SSL/TLS协议。是的,它无处不在。因此,虽然X.509证书可能没有通用的文件格式,但是至少有一种通用语言可以在服务器上操作它们。OpenSSL是用C语言编写的,这使得任何有编程基础知识的人都可以访问它。


因此,现在让我们来看看如何将证书转换为正确的格式。


如何将证书转换为正确的格式?


将X.509转换成PEM——这决定了你想编码证书的方式(除非有特定的原因,否则不要选择DER)。


openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem


将DER转换成PEM——二进制编码到ASCII


openssl x509 -inform der -in certificatename.der -out certificatename.pem


将PEM转换成DER——ASCII到二进制


openssl x509 -outform der -in certificatename.pem -out certificatename.der


将PEM转换成PKCS7——PKCS7文件可以只包含容器证书和证书链,但永远没有私有密钥。


openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer


将PKCS7转换成PEM——记住,这一文件将不包括密钥对。


openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem


将PKCS12转换成PEM——也称为PFX,PKCS12容器可以包括证书、证书链和私有密钥。它们有密码保护,得到了加密。


openssl pkcs12 -in certificatename.pfx -out certificatename.pem


将PKCS12转换成PKCS8——PKCS8与PKCS7类似,只不过它针对的是私有密钥存储,并且可以用密码加密。


这需要两个步骤:


openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem


openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8


将PKCS7转换成PKCS12——这需要两个步骤,因为你将需要把私有密钥和证书文件结合起来。


openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer 


openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile  cacert.cer