无法使用 JMOD 打包已签名的 Java 安全提供程序

tra*_*sty 10 java java-11

我正在阅读有关在 Java 加密体系结构中实现提供程序的文档,它指出

您不能在 JMOD 文件中打包签名的提供程序

文章还指出:

只有提供 Cipher、KeyAgreement、KeyGenerator、Mac 或 SecretKFactory 实例的提供者必须被签名。如果您的提供者仅提供 SecureRandom、MessageDigest、Signature、KeyStore 等的实例,则不需要对提供者进行签名。

我正在尝试使用 JDK 11 版本开发此提供程序,该版本使用 .jmod 文件代替 .jar 文件。

我正在查看标准安全策略使用的函数 ,其中许多使用 Cipher、KeyAgreement、KeyGenerator、Mac 或 SecretKeyFactory,但在我使用的 JDK 11 中以某种方式打包成 .jmod 格式。

任何人都可以进一步解释这一点吗?

Jor*_*nee 1

JDK 中打包的 jmod 文件中的提供程序未“签名”,因为 jmod 不支持签名。例如,如果您检查 .jmod 文件,jmod list您将找不到任何 .SF 签名文件。

我正在尝试使用 JDK 11 版本来开发此提供程序,该版本使用 .jmod 文件来替换 .jar 文件。

请注意,.jmod 文件并不能完全替代 jar 文件。jmod 文件是仅链接的工件。来自jmod 文档

JMOD 文件格式允许您聚合 .class 文件、元数据和资源以外的文件。这种格式是可传输的,但不可执行,这意味着您可以在编译时或链接时使用它,但不能在运行时使用它。

换句话说,与 JDK 捆绑在一起的 jmod 文件不会直接加载来执行,而是要提供给 jlink 等工具,这些工具会将它们分开并重新打包。这种重新打包将以任何方式使任何签名哈希值无效,因此 jmod 文件需要支持签名的理由较少。

如果您想分发自定义提供程序,则必须使用 jar 文件分发它们,然后对这些 jar 文件进行签名。加载提供程序时是否需要签名取决于 JDK 发行版。

请注意,JDK 自己的提供程序不是从捆绑的 jmod 文件加载的,而是从特定于实现的存档加载的,该存档的有效性是使用另一种机制验证的。


仅当您想要将本机库打包到存档中,然后分发该存档时,才需要使用 jmod 文件。在这种情况下,您的用户将必须重新打包,然后重新签名他们最终基于 jmod 文件生成的任何工件。

如果您不需要分发本机库,我的建议是分发 .jar 文件,可以对其进行签名jarsigner,然后直接用于执行。正如 jmod 文档中所述:

注意:对于大多数开发任务,包括在模块路径上部署模块或将它们发布到 Maven 存储库,请继续将模块打包在模块化 JAR 文件中。jmod 工具适用于具有本机库或其他配置文件的模块,或者您打算使用 jlink 工具链接到运行时映像的模块。