1. Keystore 概念与类型选择:JKS / PKCS12 / BCFKS
适用场景
- JKS:仅用于 Java 传统环境(JDK < 9),适用于内部工具链或遗留系统迁移。不适合多语言互通或跨平台分发。
- PKCS12:通用标准格式(.p12 / .pfx),适用于 HTTPS 证书部署、移动端签名、TLS 双向认证、CI/CD 供应链。支持密钥对 + 证书链 + 私钥加密。
- BCFKS:Bouncy Castle 专有格式,适用于需要 FIPS 140‑2 合规、国密算法支持、大量私钥容器(>10K)的高安全场景。常见于政务云、金融核心系统。
前置条件
| 条件 | 说明 |
| JDK / JRE 版本 | keytool 需 JDK 8+(推荐 11+ 以原生支持 PKCS12) |
| Bouncy Castle 库 | 操作 BCFKS 需在 classpath 或 JRE 中注册 Bouncy Castle Provider |
| 文件系统权限 | 存放 keystore 的目录需 700 权限,私钥文件 chmod 600 |
| 密码策略 | Keystore 口令 & 私钥口令需符合企业密码复杂度要求(长度 ≥16,含特殊字符) |
操作步骤
- 评估环境:确认操作系统、JDK 版本、是否部署 Bouncy Castle Provider。
- 对照选型决策表(见下方),按 互联需求、密钥数量、合规要求 三轴确定格式。
- 创建空 Keystore(以 PKCS12 为例):
keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 \
-keystore app-server.p12 -storetype PKCS12 -storepass ChangeMe!01 \
-dname "CN=Server, O=Example, C=CN" -validity 3650
- 验证格式与一致性:
keytool -list -v -keystore app-server.p12 -storetype PKCS12
openssl pkcs12 -info -in app-server.p12 -noout -passin pass:ChangeMe!01
- 归入凭证管理仓库:将 keystore 文件 + 元信息(别名、指纹、有效日期)录入内部 CMDB。
选型决策表
| 评估维度 | JKS | PKCS12 | BCFKS |
| 标准开放度 | Java 专有 | RFC 7292 | BC 扩展 |
| 密钥算法支持 | RSA / DSA / EC | RSA / EC / EdDSA | RSA / EC / 国密 SM2/SM4 |
| 安全性(私钥保护) | 弱 PBKDF2 | 强 PBES2 / AES | FIPS 140‑2 级 AES‑256 |
| 大容量性能(>5K 条目) | 差 | 中等 | 优 |
| FIPS 合规 | 否 | 有条件(需 FIPS 模块) | 原生 |
| **推荐优先级** | ❌ 仅迁移用 | ✅ 首选 | ⭐ 高安全/国密 |
输入 / 输出物
输入:环境清单、安全策略文档、证书申请 CSR
输出:
- 选型决策日志(含三轴评估结论)
- 初始 keystore 文件(.jks / .p12 / .bcfks)
- 密码托管记录(Hashicorp Vault / 企业密码保险箱)
- 格式验证报告(keytool list + openssl 检查输出)
责任边界
- 安全架构师:制定选型决策表,审批格式切换。
- DevOps / 系统管理员:执行创建、备份、密码轮换。
- 应用开发团队:提供 alias、证书有效期、DName 需求。
- 安全审计:定期抽查 keystore 文件是否落入选型决策之外的类型。
记录材料
# 必须保留的记录项
- 选型会议纪要(含决策理由)
- keystore 属性清单:文件名、格式、指纹(SHA‑256)、有效期、存储路径
- 密码托管凭证 ID
- 首次创建命令(脱敏后)
异常处理
| 异常场景 | 处理步骤 |
keytool error: java.io.IOException: Keystore was tampered with... | 检查密码是否输入错误;恢复上次备份;重新生成 |
| PKCS12 无法被 OpenSSL 解析 | 确认未使用 -storetype JKS 伪标识;改用 -storetype PKCS12 重试 |
BCFKS 创建抛出 NoSuchProviderException | 检查 Bouncy Castle jar 版本(建议 1.70+);在 JDK 安全属性中添加 provider |
| 密码强度不满足企业策略 | 退回至密码生成器(如 openssl rand -base64 18)重新生成后重置密码 |
验收标准
- Keystore 指纹与证书请求 CN 一致,无自签名警告(用于生产时须受信任 CA 签发)。
- 可通过
keytool -list -v 完整查看所有条目信息。
- 私钥口令与 keystore 口令 不同(密钥口令隔离),且已录入密码保险箱。
- 选型决策表所有维度已评估,并有明确结论(附件记录)。
- 文件权限 600/700,备份已同步至灾备存储。