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