我正在使用Java Webstart技术开发Java桌面应用程序。 我使用有效证书签署我的应用程序,并使用JnlpDownloadServlet进行部署。 我使用maven-webstart-plugin准备了所有这些基础设施。
但是当我的证书到期并且我必须辞职并重新部署我的应用程序时,我遇到了使webstart完全重新下载我的应用程序的问题。
据我所知,基于我可以从Internet收集的内容(Webstart官方文档很糟糕),默认情况下,webstart会根据文件服务器时间检查版本并更新库(Last-Modified HTTP标头)
如果是这样,webstart客户端应该完全下载我的应用程序的新版本。
但是,webstart只是在JNLP文件中下载具有更新版本号的库,因为maven webstart插件会生成它们。
应用程序无法启动,抱怨不同的签名JAR,当我查看tomcat访问日志时,服务器中唯一已检查和已下载的文件是JNLP文件,具有真正较新版本的JAR和另一个JAR (我假设这是下载,签名检查,并使客户端失败的那个)所有请求都是GET,没有HEADs
我不使用JNLP中的基于版本的协议(由jnlp.versionEnabled
属性激活),但webstart客户端的行为就像它已经开启一样。
我的JNLP更新选项是
<update check="always" policy="always" />
我看到的唯一解决方案是更新所有JAR的版本号,在版本号上附加内容,但JNLP“renderization”由webstart-plugin自动完成,我更喜欢更简单,更健壮的方法。 / p>
想法?
修改
看起来基于版本的下载协议正在被触发,因为JNLP文件中的jar元素具有version
属性。这是由webstart插件自动添加的。在管理依赖项版本时,这是一项很棒的功能。但如果您只想更新签名,那就太痛苦了。
答案 0 :(得分:2)
我发现由于1.5 Java支持验证过期签名(如果它们带有时间戳):
http://docs.oracle.com/javase/tutorial/deployment/jar/signing.html
这里也很好地解释了:https://stackoverflow.com/a/24178906/134898
幸运的是,maven-webstart-plugin从版本1.0-beta5开始就支持这个:
<sign>
<storetype>pkcs12</storetype>
...
<tsaLocation>https://timestamp.geotrust.com/tsa</tsaLocation>
</sign>
现在,只要时间戳有效,即使我的签名证书过期,webstart客户端也会接受该应用程序。 (我使用私有CA证书和过期的签名证书进行了测试)
我将继续使用基于webstart版本的协议来实现我的库中的真正更改,这将触发独立的JAR下载,一切都很好,世界很美。