Skip to content

JEP 229: Create PKCS12 Keystores by Default | 默认创建 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 版本上进行大量测试,以确保访问密钥库的应用程序的兼容性得以维持。