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

时间:2016-10-06 07:56:48

标签: java jarsigner jdk1.7

似乎撤销了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/

4 个答案:

答案 0 :(得分:10)

我在过去的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

希望这会有所帮助。

答案 1 :(得分:1)

从GeoTrust链接看起来似乎所有人都需要TLSv1.1,并且来自"诊断TLS,SSL和HTTPS"链接似乎最早支持TLSv1.1的Java版本是JDK 6更新111.因此该解决方案可能会在这些版本中运行。

我还没有切换到JDK 6更新111来测试这个;我等着听到那些一直坚持使用旧Java版本的客户,看看我们可以使用的现代Java版本如何在不切断它们的情况下使用。

附录:客户在JDK8上,所以我只是切换到了这个,并且如上所述,这不需要-J-Dhttps.protocols = TLSv1.2,因为TLSv1.2是JDK 8的默认值。

答案 2 :(得分:1)

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

在signjar任务中添加以下行:

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

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

答案 3 :(得分:0)