bigywater.tech
Java · 213

KeyStore:管理密钥与证书的容器边界

KeyStore 里到底装了什么、格式有什么区别、密码错了是什么报错?这篇用 keytool 生成真实的 PKCS12 与 JKS 文件,逐项验证(TLS 的信任校验见前面的篇目,PKIX 证书路径验证在后面)。

pkcs12
JDK 21 的默认 KeyStore 类型
Cannot store non-PrivateKeys
JKS 存放对称密钥时的异常
111 个
JDK 自带 cacerts 里受信任的根证书数

类型与文件头

实测 · 本机执行输出
  KeyStore.getDefaultType() = pkcs12
  a.p12   文件头 308203da → KeyStore.getInstance(File, 密码) 自动识别为 PKCS12,别名 [srv]
  b.jks   文件头 feedfeed → KeyStore.getInstance(File, 密码) 自动识别为 JKS,别名 [srv]
  PKCS12:getKey("srv") → EC PKCS#8,isKeyEntry = true,证书链长度 = 1,别名大小写:containsAlias("SRV") = true

密码与错误

实测 · 本机执行输出
  PKCS12 密码错误 → IOException: keystore password was incorrect;cause = UnrecoverableKeyException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
  JKS 密码错误 → IOException: Keystore was tampered with, or password was incorrect
  JKS 的私钥有自己的密码(这里是 keypass1),用 store 密码取 → UnrecoverableKeyException: Cannot recover key
  用正确的私钥密码取 → RSA
  用 PKCS12 类型读一个 JKS 文件:成功(JDK 会兼容识别),类型 = PKCS12

条目类型

实测 · 本机执行输出
  PKCS12:存放对称密钥(SecretKeyEntry)→ 成功,读回的类型 = AES,isKeyEntry = true,文件 415 字节
  JKS:存放对称密钥 → KeyStoreException: Cannot store non-PrivateKeys
  TrustedCertificateEntry:setCertificateEntry 之后 isCertificateEntry = true,isKeyEntry = false;getCertificateAlias(同一张证书) = trusted-demo
  getEntry 返回的类型 = PrivateKeyEntry,entry.getAttributes() 里有 2 个属性
  deleteEntry 之后 size = 0

cacerts

实测 · 本机执行输出
  JDK 自带的 cacerts:类型 PKCS12,受信任的根证书 111 个;前三个别名 [actalisauthenticationrootca [jdk], addtrustexternalca [jdk], addtrustqualifiedca [jdk]](别名里常带 [jdk] 标记)
  其中 TrustedCertificateEntry 有 111 个
  javax.net.ssl.trustStore 没设置时,默认的信任库是:null(null = 用 cacerts,密码默认 changeit)

分步演示

KeyStore
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK(Temurin 17.0.20、Homebrew 21.0.12 与 27,每篇注明实际用的版本);用 javac 编译、java 直接运行,需要第三方库时用 Maven 解析依赖;计时用 System.nanoTime,数字每次运行会有小幅抖动。JDK 21.0.12(Homebrew 构建的 cacerts),keytool 生成 EC 与 RSA 密钥
    • 没有验证:PKCS12 的加密算法与迭代次数(PBE 参数)、JCEKS/BKS 等其它类型、硬件密钥库(PKCS11、macOS KeychainStore)、密钥库文件权限与密码的存放;cacerts 的数量随 JDK 构建而不同
    京ICP备2026067502号-1京公网安备11010502063487号