> 文章列表 > X.509证书

X.509证书

X.509证书

证书格式

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