我正在阅读有关在 Java 加密体系结构中实现提供程序的文档,它指出
您不能在 JMOD 文件中打包签名的提供程序
文章还指出:
只有提供 Cipher、KeyAgreement、KeyGenerator、Mac 或 SecretKFactory 实例的提供者必须被签名。如果您的提供者仅提供 SecureRandom、MessageDigest、Signature、KeyStore 等的实例,则不需要对提供者进行签名。
我正在尝试使用 JDK 11 版本开发此提供程序,该版本使用 .jmod 文件代替 .jar 文件。
我正在查看标准安全策略使用的函数 ,其中许多使用 Cipher、KeyAgreement、KeyGenerator、Mac 或 SecretKeyFactory,但在我使用的 JDK 11 中以某种方式打包成 .jmod 格式。
任何人都可以进一步解释这一点吗?
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 工具链接到运行时映像的模块。