Appearance
PEM、CRT、CER、DER、PFX 与 JKS:证书文件怎么选?
判断一个证书文件,依次看三层:里面装了什么、采用什么编码、目标服务如何读取。 扩展名可以提供线索,最终以文件内容与解析结果为准。
常见格式对照
| 名称 | 含义与常见内容 | 是否可能包含私钥 | 常见用途 |
|---|---|---|---|
| PEM | 带 BEGIN/END 标签的 Base64 文本编码;可装证书、私钥、CSR 等对象 | 取决于标签和实际对象 | Nginx、Apache、HAProxy、面板及 Kubernetes TLS Secret 的输入材料 |
| CRT | 常用于证书文件的扩展名;常见内容为 PEM,也可能是 DER | 标准证书对象只包含公钥;仍需检查文件实际内容 | Linux 证书文件命名 |
| CER | 常用于证书文件的扩展名;可为 DER 或 PEM | 同上 | Windows 或设备的证书导入导出 |
| KEY | 常用于私钥文件的扩展名,不限定具体编码或密钥格式 | 通常包含私钥,应按敏感材料保管 | 与证书配套的独立私钥文件 |
| DER | ASN.1 数据的二进制编码规则;用于证书,也可编码其他对象 | 取决于所编码的对象 | 单张二进制证书、设备或程序接口 |
| PFX / P12 | 日常证书交付中通常指 PKCS#12 容器,可装私钥、证书及证书链 | 可以;也可能只装证书 | IIS 导入、身份材料迁移、Java PKCS12 密钥库 |
| JKS | Java KeyStore 文件格式,按 Alias 保存私钥条目及证书链,或受信任证书条目 | 可以,需查看条目类型 | 使用 JKS 的 Java 服务 |
例如,server.crt 与 server.pem 可以保存同一份 PEM 证书。将 DER 文件改名为 .pem 只改变文件名;转换编码需要使用解析工具。
PEM 使用 Base64 编码,私钥的密码保护由具体密钥格式和加密设置提供。含私钥的 PEM、PFX、JKS 都应限制访问,并在可信的本地环境中转换。
先识别对象,再选择工具
PEM 标签中的 CERTIFICATE 表示证书,CERTIFICATE REQUEST 表示 CSR,PUBLIC KEY 表示公钥;PRIVATE KEY、ENCRYPTED PRIVATE KEY 以及某些算法专用私钥标签表示私钥材料。
一个 PEM 文件可以包含多段对象。部署用 fullchain.pem 通常放站点证书及中间链;HAProxy 等场景还可能要求把私钥放入同一个 PEM 文件。应结合目标配置检查整个文件。
下面命令适用于已安装 OpenSSL 的终端;文件名替换为本地文件。命令仅解析材料,信任验证见信任链指南。
读取 PEM 或 DER 证书
PEM 证书:
sh
openssl x509 -inform PEM -in server.pem -noout -subject -issuer -dates -fingerprint -sha256DER 证书:
sh
openssl x509 -inform DER -in server.cer -noout -subject -issuer -dates -fingerprint -sha256按已知编码选择命令。读取失败时,确认文件是否实际为 CSR、私钥、PKCS#7 或密钥容器,以及文件是否完整。openssl x509 默认检查单张证书;多段 PEM 的完整链需另外检查。
检查 PFX 内容类型
sh
openssl pkcs12 -in server.pfx -info -noout在交互提示中输入容器密码。-noout 避免输出证书和私钥本体,信息中可查看证书袋、密钥袋及保护算法。容器是否能在目标 Windows 或 Java 版本中导入,还取决于其支持的保护算法。
检查 Java 密钥库
sh
keytool -list -v -storetype JKS -keystore server.jks若实际格式是 PKCS#12,则使用:
sh
keytool -list -v -storetype PKCS12 -keystore server.pfx输入密钥库密码后,检查目标 Alias 和条目类型:
PrivateKeyEntry:包含私钥及关联证书链,服务端身份通常引用此类条目。trustedCertEntry:保存受信任证书,用于信任判断。
Keystore 与 truststore 描述使用角色,两者都可能采用 JKS 或 PKCS12。Java 9 起默认密钥库类型为 PKCS12;实际服务仍按其配置、Provider 与文件内容读取。
编码转换:PEM 与 DER
以下转换只处理单张公开证书,使用不同输出文件名保留原件。
sh
openssl x509 -inform DER -in server.cer -outform PEM -out server-converted.pem
openssl x509 -inform PEM -in server.pem -outform DER -out server-converted.der转换前后可用上面的读取命令比较 SHA-256 证书指纹。指纹一致表示证书本体一致;有效期、公钥与签发者签名均保持原样。
上述 openssl x509 命令计算解析后证书的 DER 指纹;文件哈希则包含换行、空白等文本差异。核对同一张证书时,比较证书指纹;核对文件是否逐字节相同时,比较文件哈希。
按部署环境选择
| 环境 | 应准备的材料 | 继续阅读 |
|---|---|---|
| Nginx / Apache | PEM 站点证书、中间链与匹配私钥,按指令分别引用 | Nginx · Apache |
| IIS | 含匹配私钥的 PFX,导入证书存储后配置 HTTPS 绑定 | IIS 部署 |
| Tomcat | 与 Connector 配置一致的 JKS 或 PKCS12,核对 Alias、密码和私钥条目 | Tomcat 部署 |
| HAProxy | 按 bind 配置准备证书链与私钥材料,现有教程采用合并 PEM | HAProxy 部署 |
| 宝塔 / 1Panel | 按面板输入项提供 PEM 证书链与私钥 | 宝塔 · 1Panel |
| Kubernetes | tls.crt 存 PEM 证书链,tls.key 存匹配私钥,并由入口引用 Secret | Kubernetes 部署 |
PFX/JKS 中的私钥条目需要原私钥和匹配证书才能建立。已有 KeyManager 材料时,优先按下载与导出指南操作;缺少私钥时,先按私钥来源指南查找。
部署 SM2 证书时,除文件格式外,还要确认目标协议栈支持 SM2。KeyManager 目前不支持将国密证书导出为 JKS/PFX。
