前言
SSL 证书存在多种不同的格式, 例如: cer, crt, der 等, 那么不同格式之间具体有什么差异呢, 其背后又是什么原理, 不同证书怎么转换呢, 本文将重点探讨这些, 不同于其他文章追本溯源, 本文将使用从源头开始描述的方式书写, 需要一些耐心.
ASN.1
简介
ASN.1 抽象语法标记 (Abstract Syntax Notation One) ASN.1 是一种 ISO/ITU-T 标准, 描述了一种对数据进行表示, 编码, 传输和解码的数据格式. 它提供了一整套正规的格式用于描述对象的结构, 而不管语言上如何执行及这些数据的具体指代, 也不用去管到底是什么样的应用程序.
简单的说 ASN.1 , 与语言无关, 与平台无关, 仅仅是对数据结构的描述, 而没有数据结构的实现
详情请见: ISO/IEC 8824
例子
- Report ::= SEQUENCE {
- author OCTET STRING,
- title OCTET STRING,
- body OCTET STRING,
- biblio Bibliography
- }
- Bibliography ::= SEQUENCE {
- author OCTET STRING
- title OCTET STRING
- publisher OCTET STRING
- year OCTET STRING
- }
在这个例子中,"Report" 是由名字类型的信息组成的, 而 SEQUENCE 表示消息是许多数据单元构成的, 前三个数据单元的类型是 OCTET STRING, 而最后一个数据类型是 Bibliography 类型.
可见 ASN.1 可以嵌套各种自定义类型, 这样就很灵活. 并没有描述具体细节, 比如: 虽然规定要描述: OCTET 字节长度, 但并没有具体规定使用 32 位还是 64 位存储 数据类型长度, 也没有描述 STRING 具体的编码类型.
这些最终由具体的编码规则制定
具体编码规则
- BER(Basic Encoding Rules)
- CER(Canonical Encoding Rules)
- DER(Distinguished Encoding Rules)
- PER(Packed Encoding Rules)
- XER(xml Encoding Rules)
ASN1.PNG
X.509
X.509 证书, 其核心是根据 RFC 5280 制定.
证书组成结构标准用 ASN.1 进行描述. X.509 v3 数字证书结构如下:
证书
- ...
- 公钥算法
- 主题公钥
- 此日期前无效
- 此日期后无效
- 版本号
- 序列号
- 签名算法
- 颁发者
- 证书有效期
- 主题
- 主题公钥信息
- 颁发者唯一身份信息 (可选项)
- 主题唯一身份信息 (可选项)
- 扩展信息 (可选项)
- 证书签名算法
- 数字签名
编码方式
PEM 编码 (Privacy Enhanced Mail)
特点: 纯文本文件, 以 -----BEGIN 某某某 ----- 开头, 以 -----END 某某某 ----- 结尾, 内容是 base64 编码. 但使用文本编辑器只能查看表面的结构, 需要输入命令例如 openssl x509 -in 某个 PEM 格式数字证书. pem -text -noout 才能看到原始的数字证书信息
ps:
如果存在 --BEGIN CERTIFICATE--, 则说明这是一个证书文件.
如果存在 --BEGIN RSA PRIVATE KEY--, 则说明这是一个私钥文件.
DER 编码 (Distinguished Encoding Rules)
特点: 二进制文件格式, 一般应使用 Windows/Java 开发工具打开, 也可以使用 openssl 命令行工具提取其中信息或进行编码转换.
openssl x509 -in 某个 DER 格式的数字证书. der -inform der -text -noout
上面这个命令查看二进制文件中的证书信息.
PEM 和 DER 编码差异请查看: 证书文件编码格式介绍
通用类型文件
DER: 使用 DER 编码的文件, 但并不一定是 SSL 证书
PEM: 使用 PEM 编码的文件, 但并不一定是 SSL 证书
SSL 证书类型
CRT - PEM or DER, 大多数是 PEM 编码
CER - PEM or DER, 大多数是 DER
PFX/P12 - CRT or CER 和 KEY 组合体, 采用 DER 编码, 即证书和私钥的结合体. PFX 用于 Linux/Windows , P12 用于 MacOS
KEY - 通常用来存放一个公钥或者私钥, 并非 X.509 证书, 编码同样的, 可能是 PEM, 也可能是 DER.
查看 KEY 的办法:
openssl rsa -in mykey.key -text -noout
如果是 DER 格式的话, 同理应该这样了:
openssl rsa -in mykey.key -text -noout -inform der
JKS - 即 Java Key Storage, 这是 Java 的专利, 跟 OpenSSL 关系不大, 利用 Java 的一个叫 "keytool" 的工具, 可以将 PFX 转为 JKS. 注: keytool 也能直接生成 JKS.
文件查看和转换
查看
查看 PEM 编码文件
openssl x509 -in pemEncodeFile -text -noout
查看 DER 编码文件
openssl x509 -in derEncodeFile -inform der -text -noout
转换
PEM 转为 DER:
openssl x509 -in pemEncodeFile -outform der -out cert.der
DER 转为 PEM:
openssl x509 -in derEncodeFile -inform der -outform pem -out cert.pem
总结
der 文件仅仅是使用 DER 编码的文件, 不一定是证书, 只有符合 x.509 规范的 der 文件才能被称为证书, crt 和 der 可以互相转换, 也可以转为 der 文件, 只不过通常 crt 文件采用 pem 格式, der 文件采用 der 格式罢了.
值得注意的是苹果官方 Security API 只支持 Der Encode.
image.PNG
相关链接:
如何从不同扩展名的数字证书中提取明文信息? *.pem *.der *.crt *.cer *.key 之间的区别是什么?...
SSL 证书格式详解与转换
证书文件编码格式介绍
DER,CRT,CER,PEM 格式的证书及转换
来源: http://www.jianshu.com/p/5de48496d989