【发布时间】:2020-07-23 17:50:28
【问题描述】:
(tl,dr 结尾)
我们有一个生成自签名 SSL 证书的小方法,它显然依赖于sun.security.x509。目前我们仍在使用 JDK8 构建它,尽管其余代码库(它只是一个小型的单一库)是使用 JDK11 构建并使用 JVM11 运行的。
不幸的是,在主 JDK 中没有替换,根据(和 CertificateFactory 几乎没有生成证书,这与它的 javadoc 状态相反......):
- https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8165481
- https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058778
一种选择是使用 BouncyCastle,但我们真的不需要额外的 4MB,尤其是对于这么小的任务,所以我在考虑如何访问它的同时
据我所见,包和所需的类仍然是包,相关的类仍然存在(请参阅sun.security.x509 on github 但是在构建它时(使用 maven)我收到错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project: Compilation failure: Compilation failure:
[ERROR] OldSelfSignedCertificateGenerator.java:[20,25] package sun.security.x509 does not exist
[ERROR] OldSelfSignedCertificateGenerator.java:[71,45] cannot find symbol
[ERROR] symbol: class X509CertInfo
[ERROR] location: class OldSelfSignedCertificateGenerator
我搜索了一下并添加:
<arg>--add-exports</arg><arg>java.base/sun.security.x509=ALL-UNNAMED</arg>
到maven-compiler-plugin 并且它有点工作 - 我只得到WARNING 而不是sun.security.x509 包:
[WARNING] OldSelfSignedCertificateGenerator.java:[20,25] sun.security.x509.AlgorithmId is internal proprietary API and may be removed in a future release
但是!现在看来我进入了(不情愿地!)模块系统,它抱怨访问其他基本 Java 类(以及我们的另一个依赖项):
[ERROR] CertificateUtil.java:[35,17] package java.util.logging is not visible
(package java.util.logging is declared in module java.logging, but module java.base does not read it)
我尝试以相同的方式将java.logging 模块添加到导出中,但没有取得多大成功。看来我还必须将此库及其对模块系统的依赖项都转换为模块系统,这并不是真正需要的。
这个问题和How to generate a self-signed certificate using only JDK supported classes?有点关系
tl,博士;
有没有办法在没有模块系统的JDK 11下使用sun.security.x509包编译库?一些简单的开关?
【问题讨论】: