PEM是OpenSSL和许多其他SSL工具的标准格式。OpenSSL使用PEM文件格式存储证书和密钥。在OpenSSL中,PEM文件是Base64编码的证书。PEM证书通常用于Web服务器,因为它们可以通过一个简单的文本编辑器很容易地转换成可读的数据。通常,当一个PEM编码在文本编辑器中打开文件时会包含不同的页眉和页脚。例如,证书签名请求CSR的格式如下:
-----BEGIN CERTIFICATE REQUEST----- ... -----END CERTIFICATEREQUEST-----
RSA私钥文件格式如下:
-----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATEKEY-----
证书文件格式如下:
-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
它们通常都以后缀名.pem进行保存。后缀名为.pem的文件是常见的密钥、证书存储信息的文件,是一个文本文件,实际内容进行了编码(比如使用Base64),然后在内容首尾添加一些标记信息。PEM(Privacy Enhanced Mail),定义了加密一个准备要发送邮件的标准,主要用来将各种对象保存成PEM格式,并将PEM格式的各种对象读取到相应的结构中。它的基本流程是这样的:
(1)信息转换为ASCII码或其他编码方式(比如Base64)。
(2)使用对称算法加密转换了的邮件信息。
(3)使用Base64对加密后的邮件信息进行编码。
(4)使用一些信息头对信息进行封装。头信息格式(不一定都需要,可选的)如下:
Proc-Type,4:ENCRYPTED DEK-Info: cipher-name, ivec
其中,第一个头信息标注该文件进行了加密,该信息头可能的值包括ENCRYPTED(信息已经加密和签名)、MIC-ONLY(信息经过数字签名但没有加密)、MIC-CLEAR(信息经过数字签名但是没有加密、没有编码,可使用非PEM格式阅读),以及CLEAR(信息没有签名和加密并且没有进行编码,该项是OpenSSL自身的扩展);第二个头信息标注加密的算法以及使用的ivec参量,ivec提供的应该是一个随机产生的数据序列,与块加密算法中要使用的初始化变量(IV)不一样。
(5)在实际信息的前后加上如下形式的标注信息(标注信息根据实际内容不同而不同)。
比如RSA私钥文件的标注信息如下:
-----BEGIN RSA PRIVATE KEY----- 实际私钥信息 -----END RSA PRIVATE KEY-----
再比如证书请求文件的标注信息:
-----BEGIN CERTIFICATE REQUEST----- 实际证书请求信息 -----END CERTIFICATE REQUEST-----
以上是OpenSSL的PEM文件的基本结构。需要注意的是,OpenSSL并没有实现PEM的全部标准,只是对OpenSSL中需要使用的一些选项做了实现,详细的PEM格式请参考RFC1421-1424。