如何使用 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 下载,一切都很好,世界很美好。