1

我正在编写一个Java 14应用程序,它应该使用和等算法验证一些签名SHA256withECDSA,但我遇到了一个特殊的副作用:SHA384withECDSASHA512withECDSAjlink

  • 当使用标准 JDK/JRE 14 运行时运行应用程序时,算法会出现(SunEC 已成功加载)
  • 当使用 JRE 运行时的优化版本运行应用程序时,使用jlink并包含jdk.crypto.ec模块,根本不加载 SunEC 并且算法不可用

我知道 OpenJDK 错误跟踪器中的这张票,但我不明白为什么优化的 jlink 版本中有不同的行为。

在 jlink 生成的运行时文件夹中,还有libsunec.so.

我正在使用此SO 代码段打印出可用的算法,并获得以下输出:

MD2withRSA
MD5andSHA1withRSA
MD5withRSA
NONEwithDSA
NONEwithDSAinP1363Format
RSASSA-PSS
SHA1withDSA
SHA1withDSAinP1363Format
SHA1withRSA
SHA224withDSA
SHA224withDSAinP1363Format
SHA224withRSA
SHA256withDSA
SHA256withDSAinP1363Format
SHA256withRSA
SHA384withRSA
SHA512/224withRSA
SHA512/256withRSA
SHA512withRSA

出于相同和相关的原因,使用策略文件验证签名的 Jar 不起作用。

谁能解释/指出我应该寻找什么?

编辑:jlink 运行时使用以下参数构建:

jlink --strip-debug \
      --strip-native-commands \
      --bind-services \
      --no-header-files \
      --no-man-pages \
      --compress=2 \
      --module-path ${JAVA_HOME}/jmods \
      --add-modules java.desktop,java.smartcardio,java.management,java.sql,java.logging,java.net.http,java.xml.crypto,jdk.crypto.ec \
      --output jlink-runtime
4

1 回答 1

0

这是JDK的官方错误

当前不支持使用 EC 证书签名的应用程序模块路径上的签名 JAR。原因是模块路径在 VM 启动期间很早就被扫描,远在 java.base 之外的代码可以执行之前。JDK-8215932 跟踪相同的问题。

于 2020-05-29T04:07:47.983 回答