OpenSSL生成的证书文件格式¶
我在 etcd集群TLS设置 使用Cloudflare 的 cfssl
工具来生成 etcd - 分布式kv存储 集群证书,分别有3中用途证书,每种证书包含3个文件(2种后缀名的文件):
.pem
.csr
那么这些不同文件的不同后缀名分别代表什么含义,以及什么用途呢?跟着手册做一遍,依然一头雾水,所以我在这里整理OpenSSL生成证书文件格式,以便能够区分和理解这些密钥证书的用途。
SSL标准文件¶
SSL标准有非常长的历史,并且有各种格式,最终这些格式标准被汇总编成 Abstract Syntax Notation 1 (ASN.1) (抽象语法符号标准1)格式化数据,也就是x509证书所使用的格式:
.csr
:Certificate Signing Request
(证书签名请求),一些应用程序生成.csr
证书签名请求提交给证书颁发机构(certificate-authorities)。.csr
文件的实际格式是 RFC 2986 中定义的PKCS10,包含了所请求证书的 部分/全部 关键细节,例如 主题(subject),组织(organization),状态(state),诸如此类,以及要签署的证书的公钥。返回的证书则是公共证书(public certificate),也就是包含公钥但不包含私钥,并且返回的公共证书有多种格式。.pem
: 在 RFC 1422(是RFC1421到1424的一部分)定义,这是一种容器格式(container format),可能只包含公共证书(public certificate)。例如Apache安装时,CA证书文件/etc/ssl/certs
;也可能包含整个证书链(entire certificate chain),即包含公钥(public key)、私钥(private key)以及根证书(root certificates)。但是很不幸,令人迷惑的是,.pem
文件还可能编码了 CSR,因为PKCS10格式可以转换为PEM。 这个名字来自隐私增强邮件(Privacy Enhanced Mail, PEM) ,虽然这是一个失败的安全电子邮件方法,但是使用的容器格式依然存在,并且是 x509 ASN.1 密钥的base64
转换.key
:.key
文件是只包含私钥
PEM格式文件,这是一种常规名称而不是标准化名称。在Apache安装中,这个文件通常位于/etc/ssl/private
目录。这个私钥.pem
文件权限非常重要,如果设置错误,一些程序会拒绝加载这些证书。.pkcs12
/.pfx
/.p12
: 最初由 RSA 在公钥加密标准(缩写为 PKCS)中定义,“12”变体最初由 Microsoft 增强,后来作为 RFC 7292 提交。这是一种受密码保护的容器格式,包含公共和私有证书对。与.pem
文件不同,容器是完全加密的。 Openssl 可以将其转换为带有公钥和私钥的.pem
文件:openssl pkcs12 -in file-to-convert.p12 -out convert-file.pem -nodes
.der
: 一种以二进制编码 ASN.1 语法的方法。.pem
文件只是一个 Base64 编码的.der
文件。 OpenSSL 可以将这些转换为.pem
(openssl x509 -inform der -in to-convert.der -out converted.pem
)。 Windows 将这些视为证书文件。 默认情况下,Windows 会将证书导出为具有不同扩展名的 .DER 格式文件。.cert
/.cer
/.crt
: 这些文件类型是使用不同扩展名的.pem
格式文件,Windows Explorer 将其识别为证书,但不会把.pem
视为证书