第2章 Keystore 创建流程

适用场景

本流程适用于以下场景:

  • 为 Java / Kotlin 应用(Android、Spring Boot、Tomcat)生成密钥库用于 TLS/SSL 双向认证。
  • 为代码签名的私钥创建受密码保护的存储容器。
  • 迁移或备份已有密钥对至标准 PKCS12 格式。
  • 初始化开发、测试、生产环境的根证书及中间证书链。

前置条件

类别条件说明
操作系统Linux / macOS / Windows(WSL 或 PowerShell)确保 PATH 中包含 JDK bin 目录
JDK 版本≥ 1.8(推荐 11+)keytool 随 JDK 分发,无需额外安装
密钥算法RSA 2048 / 4096 或 EC P-256根据需要选择强度,RSA 4096 为当前主流
别名规划唯一、有意义的别名例如 myservice-server
密码策略长度 ≥ 12,含大小写字母、数字、特殊字符Keystore 密码与密钥密码应不同

工具选择

工具适用格式特点建议
keytoolJKS / PKCS12JDK 内置,简单可靠首选项,适合小规模及开发环境
opensslPKCS12 / PEM跨平台,更灵活的凭证管理适合证书链组装及互操作场景
KeyStore Explorer多格式GUI 操作,可视化适合初学者、审计及批量管理

操作步骤

  1. 检查 JDK 环境
    java -version
    keytool -version
    确认版本 ≥ 1.8,且 keytool 可用。
  2. 生成密钥对并存入 Keystore

    使用 -genkeypair 命令,指定算法、有效期、别名及存储格式。

    keytool -genkeypair \
      -alias myservice-server \
      -keyalg RSA \
      -keysize 2048 \
      -validity 365 \
      -keystore server.p12 \
      -storetype PKCS12 \
      -storepass changeit \
      -keypass changeit
    推荐始终使用 PKCS12 代替 JKS,PKCS12 是标准化格式,兼容性更好,JDK 9 起已将 PKCS12 设为默认。
  3. 填写主体信息(交互式)

    执行后系统会提示输入以下 DN 信息:

    • CN(Common Name)—— 服务域名或全名
    • OU(组织单元)—— 部门名称
    • O(组织)—— 公司名称
    • L(城市)—— 所在地
    • ST(州/省)—— 行政区
    • C(国家代码)—— 两位字母

    也可以通过 -dname 参数非交互式指定:

    keytool -genkeypair \
      -dname "CN=api.example.com, OU=Security, O=Example Inc, L=Shanghai, ST=Shanghai, C=CN" \
      ...(其余参数同上)
  4. 设置 Key 访问密码(可选)

    若需为单个密钥设置独立密码,使用 -keypass 或后续 keytool -keypasswd。生产环境建议与 Keystore 密码不同。

  5. 生成自签名证书(可选)

    如需立即导出 PEM 格式证书供其他系统使用:

    keytool -exportcert \
      -alias myservice-server \
      -keystore server.p12 \
      -storepass changeit \
      -file myservice-server.cer

输入输出物

阶段输入输出备注
前置JDK 环境、密码策略、DN 规划—需提前审批
生成无名私钥、公共参数server.p12 密钥库文件(含私钥及自签名证书)首次生成时密钥为空
导出已存在的 Keystoremyservice-server.cer 证书文件(PEM 格式)可选步骤,用于分发公钥

责任边界

  • 密钥管理员:负责执行创建命令,保管 Keystore 密码及文件,及时备份。
  • 安全审批人:审核 DN 信息是否匹配服务标识,确认密钥强度及有效期符合策略。
  • 应用运维:将生成的 Keystore 文件部署到目标服务器,并验证 TLS 握手。
  • 审计员:定期复核密钥创建记录,比对 keytool -list 输出与变更申请。

记录材料

每次执行创建后应留存以下记录:

  • keytool -list -v -keystore server.p12 的完整输出(已脱敏密码)
  • 签发时间戳及操作员工号
  • 对应的变更单号(如使用 ITSM 系统)
  • 证书指纹(SHA-256)

异常处理

异常现象可能原因处理方式
keytool error: java.lang.Exception: Keystore file exists, but is empty文件已存在但格式损坏删除文件后重新创建,或使用 -importkeystore 修复
java.security.KeyStoreException: PKCS12 not foundJDK 版本较旧未引入 PKCS12 支持升级至 JDK 8u31+,或改用 -storetype JKS
Failed to generate key: java.security.NoSuchAlgorithmException环境缺少指定算法提供者检查 $JAVA_HOME/lib/security/java.security 或使用 Bouncy Castle 扩展
密码遗失未按密码策略记录无补救措施,必须废弃密钥并重新生成
警告:密码恢复不可行。Keystore 密码丢失后无法还原私钥。请使用企业密码管理工具(如 HashiCorp Vault、KeePass)安全存储。

验收标准

  1. 格式正确:keytool -list -v -keystore server.p12 输出显示条目类型 PrivateKeyEntry,证书链条目为 1(自签)或多级。
  2. 证书有效期:起止时间符合规划,有效天数与 -validity 参数一致。
  3. 算法强度:key algorithm 显示为 RSA 2048+ 或 EC P-256+。
  4. 指纹匹配:SHA256 指纹与运维记录的预期值一致。
  5. 导入测试:使用 keytool -importcert 测试(或服务端加载)不报错。
本章核心:使用 keytool 一行命令即可完成 Keystore 创建,但前置条件(JDK、密码策略、DN 规划)是成功的关键。后续章节将围绕证书链导入、格式转换及自动化脚本展开。
Keystore 创建流程(SOP) 1. 前置条件检查 2. 规划别名、密码、DN 3. 执行 keytool -genkeypair 4. 可选:导出 .cer 5. 列出校验 6. 记录归档 ⚠ 每个节点都必须留痕:命令输出、密码保管记录、变更单号