证书和密钥文件扩展名完整指南:PEM、CRT、DER、PFX 等
如果你曾经配置过 Web 服务器(如 Nginx 或 Apache)、管理过 SSH 密钥或处理过数字签名,你可能会遇到一系列令人困惑的文件扩展名:.pem、.crt、.cer、.der、.p12、.pfx、.key、.csr 等。
它们都一样吗?可以简单地重命名吗?本指南将揭开这些扩展名的神秘面纱,解释其内部构成,并向你展示如何有效地使用它们。
为什么会有这么多扩展名?
这种混乱主要源于两点:
- 标准 (X.509):这是公钥证书的国际标准。
- 编码方式:证书数据在文件中的实际存储方式(Base64 ASCII 文本 vs. 二进制)。
本质上,不同的平台(Windows vs. Linux)、不同的服务器(IIS vs. Nginx)以及不同的协议(SSL/TLS vs. SSH vs. PGP)在历史上都有各自偏好的方式来存储相同的基础加密信息。
快速参考表:常见的证书和密钥扩展名
| 扩展名 | 格式 | 描述 | 常见用途 |
|---|---|---|---|
.pem |
ASCII (Base64) | 隐私增强型邮件 (Privacy Enhanced Mail) | Web 服务器 (Nginx, Apache)、SSL/TLS 证书、私钥 |
.crt, .cer |
ASCII 或 二进制 | 证书 (Certificate) | 仅公钥证书(无私钥) |
.der |
二进制 | 可辨别编码规则 (Distinguished Encoding Rules) | Java 平台、Windows(常用于特定的 CA 证书) |
.key |
ASCII 或 二进制 | 私钥 (Private Key) | 与公钥证书匹配的私钥 |
.csr |
ASCII (Base64) | 证书签名请求 (Certificate Signing Request) | 发送给 CA 以请求签名证书的文件 |
.p12, .pfx |
二进制 | PKCS#12 存档 | 将证书及其私钥捆绑到一个受密码保护的文件中 |
.p7b, .p7c |
ASCII (Base64) | PKCS#7 / CMS | 导出证书链(无私钥) |
.asc, .sig, .gpg |
ASCII 或 二进制 | PGP / OpenPGP | 数字签名、加密电子邮件和软件验证 |
1. X.509 证书编码(“三大巨头”)
PEM (Privacy Enhanced Mail) — .pem, .crt, .cer, .key
这是在 Linux 和 Web 服务器上最常见的格式。它是一种基于 ASCII(文本)的格式,以 -----BEGIN CERTIFICATE----- 等标头开头,以 -----END CERTIFICATE----- 结尾。中间的数据是 Base64 编码的。
- 优点:人类可读,易于复制/粘贴到配置文件中。
- 扩展名用法:虽然
.pem是标准,但许多人对公钥证书使用.crt或.cer,对私钥使用.key,即使它们在技术上都属于 PEM 格式。
DER (Distinguished Encoding Rules) — .der, .cer
这是 PEM 文件的二进制版本。如果你在文本编辑器中打开它,你会看到“乱码”字符。
- 优点:比 PEM 更紧凑。
- 在哪里可以找到:在 Java 环境、Windows 证书导出和某些硬件安全模块 (HSM) 中很常见。
PKCS#12 (Personal Information Exchange) — .p12, .pfx
与通常只包含单个证书或密钥的 PEM 和 DER 不同,PKCS#12 是一种存档格式。它可以将证书、私钥以及整个 CA 链存储在一个受密码保护的文件中。
- 在哪里可以找到:Windows (IIS)、Java (KeyStore) 和 macOS 钥匙串的标准格式。
- 注意:
.pfx是旧的 Microsoft 扩展名,而.p12是较新的跨平台标准,但它们在功能上是相同的。
2. 请求和元数据扩展名
CSR (Certificate Signing Request) — .csr
这本身不是证书。它是你在服务器上生成的请求(包含你的公钥和组织信息),发送给证书颁发机构(如 Let's Encrypt, DigiCert)。他们会对其进行签名并返回 .crt 或 .pem 文件。
PKCS#7 / CMS — .p7b, .p7c
此格式主要用于共享“证书链”。它可能包含你的证书加上中级和根 CA 证书。它从不包含私钥。当你从 CA 下载“Windows”或“IIS”格式的证书时,经常会看到这种格式。
3. PGP 和 GPG 扩展名
如果你正在验证软件下载(如 Linux 内核或流行的库),你会看到:
.asc:ASCII 铠装的 PGP 文件(基于文本的签名)。.sig,.gpg:二进制 PGP 签名或密钥。.pub:通常用于表示 PGP 公钥。
4. 如何打开和验证这些文件
在 Linux / macOS / Windows 上(使用 OpenSSL)
OpenSSL 是处理这些文件的瑞士军刀。以下是一些常用命令:
查看 PEM 文件(公钥证书):
openssl x509 -in certificate.crt -text -noout
查看 DER 文件(二进制):
openssl x509 -in certificate.der -inform der -text -noout
查看 PKCS#12 (.p12 / .pfx) 文件:
openssl pkcs12 -info -in key-and-cert.p12
5. 格式转换
不同平台通常需要特定格式。以下是转换方法:
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
PEM 转 PFX (.p12):(需要合并证书和私钥)
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile CA-chain.crt
常见问题 (FAQ)
问:我可以简单地将 .pem 文件重命名为 .crt 吗?
答:在许多情况下是可以的。大多数 Web 服务器(如 Nginx)会查找文件内部的 "BEGIN CERTIFICATE" 标头,而不是根据扩展名判断。但是,如果平台期望的是二进制 .der 文件,而你提供的是重命名的 .pem 文件,则会失败。
问:.p12 和 .pfx 有什么区别?
答:没有功能上的区别。.pfx 是 Microsoft 的专有扩展名,而 .p12 是行业标准 (PKCS#12)。它们都作为证书和私钥的受密码保护的容器。
问:为什么我在 .p7b 文件中看不到我的私钥?
答:因为 PKCS#7 标准(由 .p7b 使用)专门设计用于证书分发,不支持存储私钥。如果你需要捆绑私钥,必须使用 PKCS#12 (.p12)。
问:.key 文件总是私钥吗?
答:通常是,但并非总是如此。虽然 .key 是私钥的常规扩展名,但一些供应商将其用于公钥甚至许可证文件。始终检查内容(例如 -----BEGIN PRIVATE KEY-----)。
Tool3M 相关工具
- 哈希生成器:使用 SHA-256 验证下载的证书文件的完整性。
- SSL/TLS 证书指南:详细了解底层安全协议。