证书文件格式是什么
证书与私钥在不同系统上用不同格式存放:PEM 是 Base64 文本,扩展名常见 .crt/.pem/.key;DER 是二进制;PKCS#12(.pfx/.p12)是把证书、私钥和中间链打包在一起、带密码保护的容器;JKS 是 Java 专用的密钥库格式。看清楚格式再转换,是本环节最常见的踩坑点——很多「证书不生效」其实只是把一个格式当成另一个用了。
基本信息
| PEM | Base64 文本,以 -----BEGIN 开头,最通用 |
|---|---|
| DER | 二进制编码,部分设备与应用导入时要求 |
| PKCS#12 | 证书 + 私钥 + 链,密码保护,扩展名 .pfx/.p12 |
| JKS | Java KeyStore,Tomcat 等 Java 应用使用 |
| 识别方法 | file 命令、openssl x509 -text、head 看开头标记 |
| 转换工具 | openssl、keytool |
典型使用场景
- 把 CA 下载的证书与中间链合成 fullchain,供 Nginx 使用
- 给 Windows/IIS 部署时把 PEM 打包成带密码的 pfx
- Java 应用上线前把 pfx 转换成 JKS 交给 Tomcat
- 排查「证书加载失败」:先用 openssl 读出内容确认格式与完整性
- 迁移证书时核对链是否齐全,避免只带叶证书导致部分客户端不信任
格式互转常用命令
格式互转常用命令
# PEM 转 DER(Nginx 之外的部分设备需要二进制)
openssl x509 -in cert.pem -outform der -out cert.der
# 合并叶证书与中间链,生成完整链文件
cat cert.pem chain.pem > fullchain.pem
# 打包成带密码的 PKCS#12 容器
openssl pkcs12 -export -in fullchain.pem -inkey key.pem -out site.pfx
# 从 PKCS#12 还原成 PEM(-nodes 表示私钥不加密)
openssl pkcs12 -in site.pfx -nodes -out all.pem
# 转成 Java 使用的 JKS
keytool -importkeystore -srckeystore site.pfx -srcstoretype pkcs12 \
-destkeystore site.jks -deststoretype jks
# 核对证书内容与主体
openssl x509 -in cert.pem -noout -subject -issuer -dates格式对照
| 格式 | 类型 | 典型用途 |
|---|---|---|
| PEM | Base64 文本,可见 BEGIN/END 标记 | Nginx、Apache 及多数 Linux 服务 |
| DER | 二进制,不可直接阅读 | 部分网络设备与 Windows 导入 |
| PKCS#12 | 证书 + 私钥 + 链,密码保护 | Windows/IIS、Java 迁移交换 |
| JKS | Java KeyStore 专有格式 | Tomcat 与 Java 应用 |
| PKCS#7 | 仅含证书链,不含私钥 | Windows 证书链导入 |
识别格式最快的办法是看文件开头:有 -----BEGIN CERTIFICATE----- 就是 PEM;用 file 命令显示 data 且 openssl x509 -inform der 能读出内容就是 DER。不要只看扩展名,同一后缀在不同 CA 手里含义可能不同。
PKCS#12 文件里含明文可导出的私钥,只靠一个口令保护:传输时应通过加密通道或受控介质,不要在聊天工具里直接发文件,导出后可考虑另行加密压缩。