JDK 带有 https tsa 的 1.7 jarsigner 不再有效

JDK 1.7 jarsigner with https tsa no longer works

似乎 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,但这也没有用。

我们还不能用 Java 8 编译,因为 Javadoc 错误。我看到的唯一解决方案是在 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/

我也是最近 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

希望这对您有所帮助。

从 GeoTrust link 来看,似乎所有需要的都是 TLSv1.1,从 "Diagnosing TLS, SSL, and HTTPS" link 来看,似乎是支持的最早 Java 版本TLSv1.1 是 JDK 6 update 111。因此该解决方案可能可以追溯到那些版本。

我还没有切换到 JDK 6 update 111 来测试这个;我正在等待听取一直使用旧 Java 版本的客户的意见,看看我们可以在不切断它们的情况下使用多么现代的 Java 版本。

附录:客户在 JDK8,所以我只是切换到那个,正如上面所建议的,这不需要 -J-Dhttps.protocols=TLSv1.2 就可以工作,因为 TLSv1.2 是默认为 JDK 8.

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

在 signjar 任务中添加以下行:

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

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

请记住 https://timestamp.geotrust.com/tsa is not longer available, you should use http://sha256timestamp.ws.symantec.com/sha256/timestamp

查看此 了解更多信息。