SSL证书格式详解:crt、pem、key、pfx、der的区别与转换
最近后台收到不少朋友的私信:申请证书后下载下来一堆文件,有 .crt、.pem、.key、.pfx、.der 各种后缀,搞不清楚区别,部署时也不知道用哪个。这篇就把常见证书格式都梳理一遍。
证书格式的两大分类
理解证书格式的关键,是先搞清楚两个维度:编码格式和文件后缀。
编码格式只有两种:
- •PEM格式:Base64文本编码,以
-----BEGIN CERTIFICATE-----开头,可以用记事本打开 - •DER格式:二进制编码,用记事本打开是乱码
文件后缀有很多种:
- •
.crt、.cer、.pem:通常是PEM编码的证书 - •
.der:通常是DER编码的证书 - •
.key:私钥文件 - •
.pfx、.p12:PKCS#12格式,包含证书和私钥 - •
.p7b、.p7c:PKCS#7格式,只包含证书链 - •
.jks:Java KeyStore,Java专用
核心结论:后缀 ≠ 编码格式,.crt 文件可能是PEM编码也可能是DER编码,要看文件内容才知道。
PEM格式
特征:
- •文本格式,可以用记事本打开
- •内容以Base64编码
- •以
-----BEGIN ...开头,-----END ...结尾 - •常见后缀:
.pem、.crt、.key、.csr
典型内容:
-----BEGIN CERTIFICATE-----
MIIFazCCBFOgAwIBAgISA2Q3N0pXV3J4S2tBaEdWOTYwRzR3MA0GCSqGSIb3DQEBCwUA
...
-----END CERTIFICATE-----
适用场景:
- •Nginx、Apache配置
- •Linux服务器部署
- •文本编辑器查看和修改
PEM是最常用的格式,90%的服务器部署都用PEM。从 sslmianfei.com 申请的ZeroSSL证书默认就是PEM格式。
DER格式
特征:
- •二进制格式,用记事本打开是乱码
- •文件体积比PEM小
- •常见后缀:
.der、.cer
适用场景:
- •Java环境(部分情况)
- •Windows IIS部分版本
- •嵌入式设备
PEM和DER的转换:
# PEM转DER
openssl x509 -in cert.pem -outform der -out cert.der
# DER转PEM
openssl x509 -in cert.der -inform der -outform pem -out cert.pem
PKCS#12格式(.pfx/.p12)
特征:
- •二进制格式
- •同时包含证书和私钥
- •通常有密码保护
- •常见后缀:
.pfx、.p12
适用场景:
- •Windows IIS部署
- •Java KeyStore导入
- •证书和私钥一起传输
生成PFX文件:
openssl pkcs12 -export -out cert.pfx -inkey private.key -in cert.pem -certfile ca_bundle.pem
从PFX提取证书和私钥:
# 提取私钥
openssl pkcs12 -in cert.pfx -nocerts -out private.key
# 提取证书
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem
如果想在线生成PFX,可以用站内的 证书转换工具,浏览器本地生成不用上传私钥。
PKCS#7格式(.p7b/.p7c)
特征:
- •Base64或二进制格式
- •只包含证书链,不含私钥
- •常见后缀:
.p7b、.p7c
适用场景:
- •Java环境
- •Windows服务器证书链导入
生成P7B文件:
openssl crl2pkcs7 -nocrl -certfile cert.pem -out cert.p7b
从P7B提取证书:
openssl pkcs7 -print_certs -in cert.p7b -out cert.pem
Java KeyStore格式(.jks)
特征:
- •Java专用格式
- •二进制格式
- •包含证书和私钥
- •有密码保护
适用场景:
- •Tomcat服务器
- •Java应用
从JKS提取证书:
keytool -list -keystore keystore.jks -storepass password
keytool -exportcert -alias myalias -keystore keystore.jks -storepass password -file cert.pem
私钥格式
私钥也有不同格式:
PKCS#1格式(RSA专用):
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA2Q3N0pXV3J4S2tBaEdWOTYwRzR3MA0GCSqGSIb3DQEBCwUA
...
-----END RSA PRIVATE KEY-----
PKCS#8格式(通用):
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDZDc3SldXc...
...
-----END PRIVATE KEY-----
EC私钥格式:
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIP...
...
-----END EC PRIVATE KEY-----
PKCS#1转PKCS#8:
openssl pkcs8 -topk8 -inform PEM -outform PEM -in private_pkcs1.key -out private_pkcs8.key -nocrypt
不同服务器的格式要求
| 服务器类型 | 证书格式 | 私钥格式 |
|---|---|---|
| Nginx | PEM (.crt/.pem) | PEM (.key) |
| Apache | PEM (.crt/.pem) | PEM (.key) |
| IIS | PFX (.pfx) | 包含在PFX中 |
| Tomcat | JKS (.jks) 或 PFX | 包含在JKS/PFX中 |
| 宝塔面板 | PEM (.crt/.pem) | PEM (.key) |
宝塔面板部署:直接在站点设置 → SSL → 粘贴PEM格式的证书和私钥即可。如果证书格式不对,用 证书查看工具 检查证书内容。
完整证书链文件
部署时通常需要把域名证书和中间证书合并成完整证书链:
# 你的域名证书
cat your_domain.crt > fullchain.pem
# 追加中间证书
cat ca_bundle.crt >> fullchain.pem
注意顺序:域名证书在前,中间证书在后,根证书通常不需要(浏览器自带)。
完整证书链的PEM文件内容类似:
-----BEGIN CERTIFICATE-----
(你的域名证书)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(中间证书)
-----END CERTIFICATE-----
如何识别证书格式
方法1:用记事本打开
- •看到Base64文本 → PEM格式
- •看到乱码 → DER格式(二进制)
方法2:用OpenSSL检测
# 检测PEM格式
openssl x509 -in cert.pem -text -noout
# 检测DER格式
openssl x509 -in cert.der -inform der -text -noout
方法3:用在线工具
把证书内容粘贴到 证书查看工具,自动识别格式并解析。
常见问题
Q:.crt和.pem有什么区别?
A:本质上没区别,都是PEM编码的证书,只是后缀名不同。.crt 多用于Linux,.pem 是通用后缀。
Q:申请证书后应该用哪个文件部署?
A:Nginx/Apache用 .crt + .key,IIS用 .pfx。具体看 证书转换工具 的转换指南。
Q:私钥可以转换格式吗?
A:可以。PKCS#1和PKCS#8可以互转,但RSA和EC不能互转(算法不同)。
Q:DER格式能用记事本修改吗?
A:不能。DER是二进制格式,修改会损坏文件。需要先转PEM,修改后再转回DER。
Q:根证书需要部署吗?
A:不需要。根证书浏览器和操作系统自带,服务器只需要部署域名证书和中间证书。
最后
证书格式看着复杂,核心就两件事:编码格式(PEM/DER)+ 内容(证书/私钥/两者打包)。
部署时记住:
- •Nginx/Apache/宝塔:用PEM格式(.crt + .key)
- •IIS:用PFX格式(.pfx)
- •Tomcat:用JKS或PFX格式
格式不对就用OpenSSL转换,或直接用 证书转换工具 在线转换。希望这篇能帮你理清证书格式的困惑。