深色模式
SSL 证书文件格式
概述
证书文件这一块最容易乱,不是因为格式太多,而是很多名字混在了一起。有人说“给我 .crt”,有人说“下载 PEM 格式”,还有人手里拿着 .p12 文件就准备往 Nginx 里塞,结果当然塞不进去。
这类文件确实适合分层理解,但“三层”不是标准术语,只是为了避免混淆的一种讲法。更准确的拆法其实是四个维度:文件里装的是什么对象、对象怎么编码、有没有再做容器打包、文件名用了什么后缀。把这四件事拆开之后,常见的证书文件基本都能看明白,也更容易判断某个服务到底需要什么。
先分清四个维度
证书文件相关的概念,至少要区分下面四个维度:
| 维度 | 典型值 | 说明 |
|---|---|---|
| 对象类型 | 证书、私钥、CSR、证书链 | 先回答“文件里装的到底是什么”。 |
| 编码方式 | DER、PEM | 回答“同一个对象是怎么表示出来的”。 |
| 容器或打包方式 | PKCS#12、JKS | 回答“是否把多个对象打包进一个容器”。 |
| 文件后缀 | .crt、.pem、.key、.p12 | 只是文件名习惯,不足以单独判断内容。 |
这四个维度并不是并列的标准分类名词,而是排查和讲解时很有用的拆分方法。真正让人混乱的地方,通常就是把其中两个维度当成了同一件事。
例如:
- 一个服务器证书,对象类型是“证书”,编码方式可以是
PEM,文件后缀可能叫.crt。 - 一个私钥,对象类型是“私钥”,编码方式也可以是
PEM,文件后缀通常叫.key。 - 一个
.p12文件,后缀是.p12,容器格式是PKCS#12,里面可能同时装着证书、私钥和证书链。
先分清格式和后缀
严格来说,.crt、.cer、.pem、.key、.p12 这些后缀,并不等于“证书规范本身”。
- 证书、私钥、
CSR是对象类型。 PEM和DER是表示这些对象的常见编码方式。PKCS#12是容器格式,用来打包多个对象。.crt、.cer、.pem、.key、.p12、.pfx更多是文件命名习惯。
同一个 X.509 证书,既可能保存成 PEM 文本,也可能保存成 DER 二进制;只是内容编码不同,不代表证书含义变了。文件后缀通常只是提示,不能只看后缀下结论,最好直接看文件内容或用 openssl 检查。
常见证书相关文件
| 类型 | 常见后缀 | 典型内容 | 说明 |
|---|---|---|---|
| 证书 | .crt .cer .pem | 服务器证书、中间证书、根证书 | 只包含公钥和证书元数据,不包含私钥。 |
| 私钥 | .key .pem | RSA / EC 私钥 | 私钥必须自己保管,泄露后证书等于白买。 |
| 证书请求 | .csr | 证书申请文件 | 向 CA 申请证书时使用,里面通常包含公钥和主题信息。 |
| 证书包 | .p12 .pfx | 证书 + 私钥,通常还带证书链 | 一般有密码保护,Windows 和 Java 场景很常见。 |
这里也能看到几个维度是怎么交叉的:
- “证书”“私钥”“CSR” 说的是对象类型。
.p12.pfx往往对应的是容器文件。.crt.pem.key更像文件命名习惯。
PEM、DER 和 PKCS#12 的区别
PEM
PEM 是文本格式,内容通常是 Base64 编码,再加上头尾标记,肉眼能直接看出来。
证书通常长这样:
text
-----BEGIN CERTIFICATE-----
MIIF...
-----END CERTIFICATE-----私钥可能长这样:
text
-----BEGIN PRIVATE KEY-----
MIIE...
-----END PRIVATE KEY-----或者这样:
text
-----BEGIN RSA PRIVATE KEY-----
MIIE...
-----END RSA PRIVATE KEY-----PEM 的优点是通用、直观、方便拼接证书链,所以 Apache、Nginx、OpenSSL 这一类环境很常见。
DER
DER 是二进制编码,文件内容不可直接阅读。它通常用于单个证书或单个密钥对象,常见后缀包括 .der、.cer、.crt。
重点不在后缀,而在文件是否为二进制。如果同一份证书一个是文本、一个是二进制,它们很可能只是 PEM 和 DER 两种不同表示方式。
PKCS#12
PKCS#12 常见后缀是 .p12 或 .pfx,它不是单纯“证书文件”,而是一个容器,可以同时打包:
- 服务器证书
- 私钥
- 中间证书
- 根证书
这种格式很适合导入系统证书库,也常用于 IIS、Windows、部分 Java 工具链。它通常带导出密码,不适合直接拿来给 Nginx 当 ssl_certificate 使用。
.crt、.cer、.pem、.key 到底怎么看
这几个后缀最容易让人误会,实际可以这样理解:
.crt和.cer通常表示“这是证书”,但可能是PEM,也可能是DER。.pem只是表示“这大概率是 PEM 文本”,里面可能是证书,也可能是私钥,还可能是证书链。.key通常表示私钥文件,内容可能是 PEM 文本。.csr通常表示证书申请文件,不拿来部署服务。
所以判断文件用途,最稳妥的方法不是看后缀,而是看头部标记:
BEGIN CERTIFICATE:证书BEGIN PRIVATE KEY或BEGIN RSA PRIVATE KEY:私钥BEGIN CERTIFICATE REQUEST:证书请求
不同服务常见用法
常见 Web 服务并不是都要求同一种文件组合,它们只是各自偏好不同。
- Nginx、Apache 通常使用 PEM 形式的证书和私钥,常见组合是
.pem或.crt加.key。 - IIS 更常见的是导入
.pfx或.p12。 - Tomcat、Java 体系过去常见
JKS,现在也经常直接使用PKCS#12。
以 Nginx 为例,最常见的是下面这类配置:
nginx
ssl_certificate /etc/nginx/ssl/site.pem;
ssl_certificate_key /etc/nginx/ssl/site.key;这里的 site.pem 往往是服务器证书加中间证书链,site.key 是对应私钥。如果证书服务商同时给了 .crt 和 .pem,两者内容有时可能一样,只是后缀不同;真正要确认的还是文件内容和部署文档。
用 OpenSSL 查看文件内容
只看后缀不够,排查时最好直接检查文件。
查看 PEM 证书:
sh
openssl x509 -in server.pem -text -noout查看私钥:
sh
openssl pkey -in server.key -text -noout查看 CSR:
sh
openssl req -in server.csr -text -noout查看 PKCS#12 文件:
sh
openssl pkcs12 -in server.p12 -info -noout如果证书是 DER 二进制格式,可以显式指定输入格式:
sh
openssl x509 -in server.cer -inform der -text -noout