证书格式
ASN.1是一种抽象的数据结构,描述了复杂的对象,以及对象之间的关系。证书本质上是一个文件,需要一种专门的格式,才能在互联网中传输,证书需要通过一个规则将ASN.1转换为二进制文件,这就需要对证书以一定的格式编码。
后缀为.cer、.der、.ber、.pem 、.crt、.pkcs12、.pfx、.p12、.p7b、.p7c的文件都是证书文件。
DER格式
在X.509证书中,使用的编码方式是Distinguished Encoding Rules(DER),ASN.1和DER的关系类似于字符集和编码的关系。
Basic Encoding Rules(BER)是DER的一个子集。Canonical Encoding Rules(CER)是另外一种编码标准。
PEM格式
DER是一个二进制文件,为了方便传输,可以将DER转换为PEM(Privacy-enhanced Electronic Mail)格式,PEM是Base64编码方式,以-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾,文件后缀为.pem。
PKCS#12格式
是公开密钥加密学的一种格式,由微软发布,文件后缀一般是.pkcs12、.pfx、.p12。
PKCS#12格式可以将证书和密钥对打包成一个文件,还可以对文件进行加密保护。
PKCS#7格式
证书的另外一种格式,主要用来进行数字签名和数据加密,文件后缀一般是.p7b或者.p7c。
常见web服务器证书格式
服务器 | 格式 |
Tomcat | pfx、jks |
Apache | crt、key |
Nginx | pem、crt、key |
IIS | pfx |
OpenSSL v3.0的证书操作命令
注意,openssl 3.0版本对密码学算法要求极其严格,有些不安全的加密算法生成的证书操作过程中可能会报错。
pem和der格式互相转化, -inform是输入格式,-outform是输出格式
# pem转der
openssl x509 -in self.pem -inform PEM -out self.der -outform DER
# der转pem
openssl x509 -in self.der -inform DER -out self_1.pem -outform PEM
从pfx文件中导出,或者生成pfx文件,需要交互式输入口令
# 由于我的pfx证书加密算法是RC2-40-CBC,在openssl v3.0版本中会报错,所以需要兼容处理
# 如果是openssl v1.0 ,去掉 -provider default -provider legacy
# 从pfx文件中导出密钥对
openssl pkcs12 -provider default -provider legacy -in self.pfx -nodes -nocerts -out keypair.key# 从pfx文件中导出服务器实体证书
openssl pkcs12 -provider default -provider legacy -in self.pfx -nodes -clcerts -out cert.pem
# 从pfx文件中导出中间证书
openssl pkcs12 -provider default -provider legacy -in self.pfx -nodes -cacerts -out chain.pem# 将上面导出的密钥对,证书,中间证书重新转换成一个pfx文件,需要交互式设置口令,需要自己记住
openssl pkcs12 -provider default -provider legacy -export -out cert.pfx -inkey keypair.key -in cert.pem -certfile chain.pem
.p7b文件操作,.p7c类似
# 根据服务器实体证书和中间证书生成p7b文件
openssl crl2pkcs7 -nocrl -certfile cert.pem -certfile chain.pem -out cert.p7b
# 从p7b中导出完整的证书链,服务器实体证书在文件内上方,中间证书在文件内下方
openssl pkcs7 -print_certs -in cert.p7b -out fullchain.cer