密码学系列之:PEM和PKCS7,PKCS8,PKCS12

贾敏
• 阅读 1552

简介

PEM是一种常见的保存key或者证书的格式,PEM格式的文件一般来说后缀是以.pem结尾的。那么PEM到底是什么呢?它和常用的证书格式PKCS7和PKCS12有什么关系呢?一起来看看吧。

PEM

PEM虽然使用来存储证书或者密钥的,但是PEM原本是和email相关联的,因为PEM的全称是Privacy-Enhanced Mail,最初是为邮件的隐私增强而创建的,是在1993年由IETF制定的标准。虽然最终的协议标准并没有被广泛采用,但是其中定义的文本编码却被广泛的使用,最终由IETF在RFC 7468中正式化。

之前我们介绍过一种协议描述语言ASN.1,ASN.1通常被用来定义协议中的数据结构,然后通过使用DER编码来对这些数据进行序列化,但是DER编码是二进制的格式,二进制文件在某些情况下不方便进行传输或者展示,不然说某些只支持ASCII编码的情况,所以需要一种可以讲DER格式转换成为文本格式的方式。

这种方式就叫做PEM。PEM使用的方法也很简单,就是对DER编码过后的二进制数据使用base64编码,将其转换成为文本文件。

在PEM中有固定的文件头和文件结尾符。文件头是以'-----BEGIN'+label+'-----'开始,文件结尾是以'-----END'+label+'-----'结束。

其中label表示的是编码的消息类型,通常可以取这些值:CERTIFICATE, CERTIFICATE REQUEST, PRIVATE KEY 和 X509 CRL。

下面是一个PEM的例子,表示其内容是一个证书:

-----BEGIN CERTIFICATE KEY-----

-----END CERTIFICATE KEY-----

虽然PEM格式的文件通常以.pem结束,但是也可以使用 ".cer" 或者 ".crt" 表示一个证书,使用".key"表示是一个密钥。

另外, 一个PEM文件中可以包含多个内容,比如对于证书来说,通常来说可能需要一些额外的信息比如证书链,这样一个证书链可以存储在一个PEM文件中。

PKCS7

PKCS7是Public-Key Cryptography Standards系列的一员,主要用来存储签名或者加密后的数据,比如证书或者CRL。PKCS7可以用原始的DER格式进行存储,也可以使用PEM格式进行存储。

如果以PEM格式进行存储,那么文件的开头和结尾分别是:

‑‑‑‑‑BEGIN PKCS7‑‑‑‑‑

‑‑‑‑‑END PKCS7‑‑‑‑‑

在windows中PKCS7通常以.p7b结尾。

PKCS7的操作可以通过openssl命令来进行。

比如将一个PKCS7的文件从PEM格式转换成为DER格式:

 openssl pkcs7 -in file.pem -outform DER -out file.der

从一个文件中提取出所有的证书到另外一个文件:

 openssl pkcs7 -in file.pem -print_certs -out certs.pem

PKCS8

PKCS8也是Public-Key Cryptography Standards系列的一员,它主要用来存储私钥。

私钥首先会使用PKCS #5的标准进行加密,然后将其进行base64编码,转换成为PEM格式进行存储。

所以说PKCS8的格式就是PEM,但是里面存储的内容是经过加密过后的私钥。

PKCS12

PKCS12也是Public-Key Cryptography Standards系列的一员,PKCS12可以看做是PKCS7的扩展,在PKCS12中可以存储证书,私钥或者CRL。和PKCS7相比,PKCS12可以额外存储私钥。

PKCS12的文件是以.p12 或者 .pfx结尾的。在JDK9中,PKCS12是默认的密钥存储格式。

PKCS12的格式和PEM相比会复杂的多,在需要的时候,我们可以使用OPENSSL将PKCS12格式转换成为PEM格式:

openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem

当然也可以从PEM到PKCS12:

openssl pkcs12 -export -in Cert.pem -out Cert.p12 -inkey key.pem

总结

以上就是PEM和PKCS系列中几个非常常用的编码格式。希望大家能够掌握和正确使用。

更多内容请参考 http://www.flydean.com/48-pem-pkcs7812/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Easter79 Easter79
4年前
tomcat配置https协议详细步骤
1.介绍了密码学的相关基础知识后,本文介绍如何在tomcat上搭建https服务。 环境:jdk7,tomcat7,windows72.我们使用java中自带的javatool工具来制作所需的https所需的证书,keytool是java自带的用于密钥和证书的生成和管理工具。3.这里先介绍两个文件格式: jks(java key store)
Wesley13 Wesley13
4年前
SSL 证书格式普及
本篇文章就是来个大家普及一下证书的格式。根据不同的服务器以及服务器的版本,我们需要用到不同的证书格式,就市面上主流的服务器来说,大概有以下格式:.DER.CER,文件是二进制格式,只保存证书,不保存私钥。.PEM,一般是文本格式,可保存证书,可保存私钥。.CRT,可以是二进制格式,可以是文本格式,与.DER格式相同,不保存私钥。.PFX
Wesley13 Wesley13
4年前
RSA加密
rsa加密的解决方案都是需要证书或者文件的,对于服务端提供了公钥,没有给证书或者pem文件的rsa加密:把公钥和你需要编码得Nsstring都转换成NSData用rsa公钥编码你所需要编码得内容最后转换成Nsstring//库 SecKeyWrapper//RSA加密\(NSString\)encryptWithStr
Stella981 Stella981
4年前
OpenSSL和Python实现RSA Key公钥加密私钥解密
基于非对称算法的RSAKey主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密)。本文提供一个基于OpenSSL和Python进行非对称加解密的例子。1\.OpenSSL实现非对称加解密1.1生成私钥,并导出公钥生成2048bit的PEM格式的RSAKey:Key.pem$openssl
Wesley13 Wesley13
4年前
Java解析X509证书代码
通过PKCS12格式的证书库文件获取证书对象InputStreaminStreamnewFileInputStream("c:/certificate.p12");KeyStoreksKeyStore.getInstance("PKCS12");ks.l
Stella981 Stella981
4年前
OpenVPN使用easy
cd/etc/easyrsa./easyrsarevoketargetkey(证书名)./easyrsagencrl其中gencrl会生成一份吊销证书的名单,放在pki/crl.pem文件里最后再server.conf文件中增加此项:crlverifycrl.pem特别说明:吊销的证书不会
Stella981 Stella981
4年前
Anroid导入Burp证书问题
一些android设备:信任CA证书,一般支持crt格式不支持der格式.所以需要装换证书格式DER转CRT命令opensslx509informDERoutformPEMinburpca.deroutmyca.crt.pem小技巧:开启微型http服务cdmydirpythonmSimpleHTTPSer
程序员小五 程序员小五
1年前
融云IM干货丨如何为App Key配置HTTPS证书?
为AppKey配置HTTPS证书主要涉及以下几个步骤:生成密钥对和自签名证书:使用openssl工具生成密钥对和自签名证书,这是配置HTTPS的基础。可以通过以下命令生成:opensslgenrsaoutmykey.pem2048opensslreqnew
程序员小五 程序员小五
1年前
融云IM干货丨Android 7.0 如何设置自定义证书?
​在Android7.0及以上版本中,系统默认不再信任用户安装的CA证书,因此需要将自定义证书导入为系统证书。以下是详细的步骤:从你的抓包工具(如Charles、Fiddler等)导出CA证书,通常为.cer或.pem格式。使用OpenSSL工具计算证书的