JEP 229:默认创建 PKCS12 密钥库
概述
将默认的密钥库类型从 JKS 转换为 PKCS12。
目标
-
提升安全性。PKCS12 提供比 JKS 更强大的加密算法。
-
保持向前和向后兼容性。访问 JKS 和 PKCS12 密钥库的应用程序必须在各个 JDK 版本中继续正常运行。
动机
JKS 是一种定制的、特定于 JDK 的密钥库类型。自 JDK 1.2 以来,它一直是 Java 平台的默认密钥库类型。JKS 密钥库只能存储私钥和受信任的公钥证书,并且它们基于一种专有格式,这种格式不容易扩展以适应新的加密算法。
PKCS12 是一种可扩展、标准化且广泛支持的用于存储加密密钥的格式。从 JDK 8 开始,PKCS12 密钥库可以存储私钥、受信任的公钥证书和秘密密钥。切换到 PKCS12 可以提高密钥库的完整性和保密性,同时也为与其他支持 PKCS12 的系统实现互操作性提供了机会。
描述
此特性将默认密钥库类型从 JKS 更改为 PKCS12。默认情况下,新密钥库将以 PKCS12 密钥库格式创建。现有的密钥库不会改变,密钥库应用程序可以继续显式指定其所需的密钥库类型。
现有的应用程序不得受到干扰。密钥库往往具有较长的生命周期,因此我们需要支持跨多个 JDK 版本的访问。访问由早期 JDK 版本创建的密钥库的应用程序必须能够在 JDK 9 上无改动运行。同样,访问由 JDK 9 创建的密钥库的应用程序也应在早期的 JDK 版本上无改动运行。
通过引入一种能够理解 JKS 和 PKCS12 格式的密钥库检测机制,实现了这一需求。在加载密钥库之前,会先检查其格式以确定其类型,然后使用适当的密钥库实现来访问它。该机制默认是启用的,但如有需要也可以禁用。
对这个密钥库检测机制的支持可能会被反向移植到更早的 JDK 版本。
测试
在 JDK 版本之间需要进行大量测试,以确保访问密钥库的应用程序的兼容性得以保持。