常见 Keystore 格式:JKS、PKCS12、PEM、PFX 的区别与适用场景

做 CI 的,整天跟 Keystore 打交道。为什么会有这么多格式?说白了,不同语言、不同工具链各玩各的。

我最早遇到这个问题,是在一个混合技术栈的项目里。Android 要用 JKS,后端服务又要 PEM,当时真是一个头两个大。今天把四种常见格式一次说清楚。

一句话总结:PKCS12 是现代首选,JKS 是 Java 老传统,PEM 是文本利器,PFX 就是 PKCS12 的马甲。

JKS(Java KeyStore)

Java 专属格式。记住了,这玩意是 Oracle/Sun 搞出来的私货。

  • 类型:密钥库 + 证书库,二合一
  • 后缀:.jks 或 .keystore
  • 依赖:keytool 工具管理
  • 特点:Java 生态原生支持,但有专利限制

记得我刚入门时,公司 Android 项目默认就是 JKS。后来 Google 都建议迁移了,我们还在用。直到有一次 CI 升级 JDK,报了一堆兼容警告… 嗯,从那以后我就开始推动换格式了。

适用场景:遗留的 Java/Android 项目、老旧的 CI 配置。新项目就别搞了。

PKCS12(Public-Key Cryptography Standards #12)

国际标准格式。现在的首选,没有之一。

  • 类型:密钥、证书链、CA 证书都能装
  • 后缀:.p12 或 .pfx
  • 依赖:OpenSSL、keytool 都支持
  • 特点:跨语言、跨平台,安全性强

我个人强烈推荐 PKCS12。在 CI 里,用一个 .p12 文件就能搞定 Android 签名、Web 服务 TLS、IoT 设备认证。别问,问就是少操很多心。

适用场景:所有新项目。Android、Java、Go、Python……哪哪都能用。

我的小技巧:CI 密钥统一存成 .p12,后面要转成其他格式,一个命令就搞定。简单省事。

PEM(Privacy-Enhanced Mail)

Base64 编码的文本格式。常用但不一定是密钥库。

  • 类型:纯文本,可存证书、私钥、CA 证书
  • 后缀:.pem、.crt、.key、.cer
  • 依赖:OpenSSL 管理
  • 特点:人类可读,方便 grep/awk 处理

你想想看,文本形式多方便。CI 脚本里写个 grep 就能提取信息,不用装任何管理工具。我曾经用 PEM 格式在几台服务器之间同步证书,一个 scp 就搞定了。

适用场景:NGINX、Apache 等 Web 服务器、容器环境(Docker 很爱 PEM)、需要手动编辑的场景。

PFX(Personal Information Exchange)

说实话,我第一次接触 PFX 时也有点懵。后来才发现,它其实就是 PKCS12 的别名。

  • 本质:PKCS12 的 Windows 叫法
  • 后缀:.pfx
  • 特点:微软生态体系内常用,与 .p12 完全互通

在 CI 场景里,你基本可以认为 PFX 就是 PKCS12。Windows 构建机、Azure DevOps 环境偏好用 .pfx 后缀。嗯,名称不同而已,不用纠结。

适用场景:Windows 生态、Azure 服务、与 .NET 项目配合时。

对比总表

格式 本质 后缀 跨平台 CI 推荐度 典型场景
JKS Java 专用 .jks/.keystore ❌ ⭐ 不推荐 老旧 Java 项目
PKCS12 国际标准 .p12 ✅ ⭐⭐⭐⭐⭐ 所有新项目
PEM 文本格式 .pem/.crt/.key ✅ ⭐⭐⭐⭐ Web 服务器、容器
PFX PKCS12 别名 .pfx ⚠️ ⭐⭐⭐ Windows/Azure 生态
Keystore 格式图谱:区别与选择 JKS Java 专属 · 已过时 PKCS12 国际标准 · 首选 PEM 文本格式 · 易读 PFX 兼容 · Windows 友好 适用场景 CI/CD · 容器 · Web 服务器 选择指南 新项目 → PKCS12 遗留 Java → 迁移至 PKCS12 本质相同 四种格式各有优劣,但 CI 场景下 PKCS12 是最稳妥的选择

格式转换(避坑指南)

CI 里经常要转格式。我曾经在迁移一个 Android 项目时,把 JKS 转成 PKCS12,结果签名一直失败。后来我发现是证书链没带全。

记住下面几个命令,够用了:

# JKS → PKCS12
keytool -importkeystore -srckeystore old.jks -destkeystore new.p12 -srcstoretype JKS -deststoretype PKCS12

# PKCS12 → PEM(提取私钥)
openssl pkcs12 -in key.p12 -nocerts -nodes -out private.pem

# PEM → PKCS12
openssl pkcs12 -export -in cert.pem -inkey key.pem -out bundle.p12

⚠️ 重点注意:

  • 转换时一定要验证证书链完整性
  • 密码别用中文或特殊符号,CI 环境解析容易出 bug
  • 转换完用 openssl verify -CAfile ca.pem cert.pem 验证一次

我的最终建议

新项目,统一用 PKCS12。老项目,逐步迁移。

至于 PFX,记住它就是 PKCS12 的 Windows 马甲就行。遇到 .pfx 文件,直接用处理 .p12 的思维去对待,不会有问题。