常见 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 生态 |
格式转换(避坑指南)
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 的思维去对待,不会有问题。