SSL 证书基础知识
前言
SSL 证书存在多种不同的格式,例如: cer, crt, der等, 那么不同格式之间具体有什么差异呢,其背后又是什么原理,不同证书怎么转换呢, 本文将重点探讨这些, 不同于其他文章追本溯源, 本文将使用从源头开始描述的方式书写,需要一些耐心。
ASN.1
简介
ASN.1抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
简单的说ASN.1 , 与语言无关, 与平台无关, 仅仅是对数据结构的描述,而没有数据结构的实现
例子
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
上面这个命令查看二进制文件中的证书信息.
通用类型文件
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, 使用PKCS#12加密标准
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
相关链接: