【问题标题】:JDK 1.7 jarsigner with https tsa no longer works带有 https tsa 的 JDK 1.7 jarsigner 不再有效
【发布时间】:2017-02-14 21:06:06
【问题描述】:

JDK 1.7.0_80 中的 Thawte 根证书似乎已被吊销。 https://www.thawte.com/roots/retired.html

使用 7u80 jarsigner 不再有效,几天前它还可以正常工作。

/usr/java/jdk1.7.0_80/jre/../bin/jarsigner -keystore /home/build/keystore.p12 -storepass storepass -storetype pkcs12 -tsa https://timestamp.geotrust.com/tsa /home/build/jenkins/workspace/my-gui/target/my-gui-3.0.29-SNAPSHOT.jar comp
jarsigner: unable to sign jar: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

我尝试在删除旧证书后将 Thawtes Timestamping CA 证书导入 cacerts。

wget https://www.thawte.com/roots/Thawte_Timestamping_CA.pem

/usr/java/jdk1.7.0_80/bin/keytool -import -trustcacerts -alias verisigntsaca -file Thawte_Timestamping_CA.pem -keystore jre/lib/security/cacerts 
Enter keystore password:  
Trust this certificate? [no]:  yes
Certificate was added to keystore

使用 JDK 8u60 中的 jarsigner 有效,因此我尝试将其 cacerts 复制到 JDK7,但这也不起作用。

由于 Javadoc 错误,我们还无法使用 Java 8 进行编译。我看到的唯一解决方案是在 JDK7 中创建符号链接到 JDK8 jarsigner。

/usr/java/jdk1.8.0_60/jre/../bin/jarsigner -keystore /home/build/keystore.p12 -storepass storepass -storetype pkcs12 -tsa https://timestamp.geotrust.com/tsa /home/build/jenkins/workspace/my-gui/target/my-gui-3.0.29-SNAPSHOT.jar comp
jar signed.

如果我将 tsa 从 geotrust 切换到 digicert,它适用于 JDK 7,因为它们不使用 https。 http://timestamp.digicert.com/

【问题讨论】:

  • 我在打包设置时遇到了与 ADT 相同的问题。默认情况下,它使用相同的 tsa URL。我正在使用 Java 1.6.0_31,它在 6 小时之前运行良好,也许更多。你是说如果使用 Java 7 或 8 就可以了吗?
  • "如果我将 tsa 从 geotrust 切换到 digicert,它可以在 JDK 7 上正常工作,因为它们不使用 https。timestamp.digicert.com" FWIW,我发现您可以同样坚持使用 geotrust,只需使用 "http ",即http://timestamp.geotrust.com.

标签: java jarsigner jdk1.7


【解决方案1】:

我也是在过去 12 小时内才遇到过这个问题。此问题与证书无关,而是与用于与时间戳服务器通信的协议有关。这将适用于 JDK7,但是您需要将以下内容添加到 jarsigner 命令中

-J-Dhttps.protocols=TLSv1.2

因此,您的命令将如下所示:

/usr/java/jdk1.7.0_80/jre/../bin/jarsigner -J-Dhttps.protocols=TLSv1.2 -keystore /home/build/keystore.p12 -storepass storepass -storetype pkcs12 -tsa https://timestamp.geotrust.com/tsa /home/build/jenkins/workspace/my-gui/target/my-gui-3.0.29-SNAPSHOT.jar comp

似乎 GeoTrust 已禁用 TLS 1.0 版,这是 Java 7 中的默认设置。以下链接提供了更多信息:

GeoTrust Partner: Disable of Transport Layer Security (TLS) version 1.0 protocol

Diagnosing TLS, SSL, and HTTPS

希望这会有所帮助。

【讨论】:

  • 这似乎是解决方案。
【解决方案2】:

user1638152 的回答绝对正确。如果有人遇到同样的问题,只需添加此信息,并且使用 Apache Ant 完成 jar 签名。

在 signjar 任务中添加以下行:

<sysproperty key="https.protocols" value="TLSv1.2" />

这与命令行中的“-J-Dhttps.protocols=TLSv1.2”完全相同。

【讨论】:

    【解决方案3】:

    从 GeoTrust 链接看来,所有需求似乎都是 TLSv1.1,而从“诊断 TLS、SSL 和 HTTPS”链接看来,支持 TLSv1.1 的最早 Java 版本似乎是 JDK 6 update 111。所以该解决方案可能可以追溯到那些版本。

    我还没有切换到 JDK 6 update 111 来测试这个;我正在等待那些被困在旧 Java 版本上的客户的来信,看看我们可以在不切断它们的情况下使用多么现代的 Java 版本。

    附录:客户使用的是 JDK8,所以我只是切换到了它,如上所述,这无需 -J-Dhttps.protocols=TLSv1.2 即可工作,因为 TLSv1.2 是 JDK 8 的默认设置。

    【讨论】:

    • 如果没有付费订阅,可供下载的最新版本是 JDK 6u45 和 JDK 7u80。虽然 OpenJDK 7 有最新的更新。
    【解决方案4】:

    【讨论】:

    • 是的,但也可以使用不使用 TLS 的 DigiCert TSA。 timestamp.digicert.com。赛门铁克现在表示,当他们停止使用旧的时间戳服务器时,应该使用 SHA256 时间戳服务器,而不是 SHA1。虽然我不确定他们的服务器上使用的是什么数字证书。
    猜你喜欢
    • 2012-02-03
    • 2021-08-25
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 2019-02-08
    相关资源
    最近更新 更多