我有一个在办公室使用的小型 javafx2 应用程序。有些人从 Firefox 运行它,有些人将它作为桌面应用程序运行。 Webstart 很棒。
目前的做法是我在jnlp文件中添加了这个:
<security>
<all-permissions/>
</security>
然后使用 key 工具在 keystore 中创建一个 key :
keytool -genkey -keystore yourKeystore -alias keyname
然后我使用 jarsigner 对用户 PC 上的所有 jar 文件进行签名:
jarsigner -keystore ./myapp.keystore -storepass xxx -keypass yyy <path to jar file> keyname
因此,用户要么使用桌面上的快捷方式文件(jnlp 文件)启动应用程序,要么在 Firefox 中浏览到该应用程序。这很好用,除了现在我们得到这个对话框说:
Running applications by UNKNOWN publishers will be blocked in a future release
我担心 future 版本发布时会发生什么。
我对所有这些代码签名的事情没有深入的了解。我知道它的工作原理是将一些二进制数据嵌入到文件中,这些文件用于证明应用程序的发布者是证书颁发机构认可的公司/个人(这就是 jarsigner 所做的 AFAIK)。证书被 Windows 和 Linux 等操作系统识别,被 Firefox 和 Safari 等网络浏览器识别,Java 也识别 2 个级别的证书,即用户和系统。有广泛接受的证书颁发机构(如 Verisign)在 Windows 和 Linux 等操作系统中被默认识别。我知道网络浏览器也能识别一些证书颁发机构,但我认为它们识别的列表可能与操作系统识别的列表不同。我猜 Java 也能识别一些但我不知道是什么。我还知道,我可以通过在 ~/.java/deployment/deployment.properties、deployment.system.security.trusted.certs 中指定 keystore ,在 Java 中配置系统级 keystore 。如果我不想为证书付费,我可以创建自己的证书(这就是我所做的)所以我的证书来自未知的发布者。我希望的是,如果我通过 deployment.system.security.trusted.certs 指定我的 keystore ,那么它将为办公室解决这个问题,但显然它没有,我不明白,因为在这种情况下系统管理员说他认得这张证书。所以现在我正在考虑在 Windows 中使用 makecert 制作证书,然后可以通过 GPO 将其推送到客户端 PC。我的理解是,这将创建操作系统可识别的证书,但我不知道 makecert 制作的证书是否会被以与例如相同的方式对待。 Windows、Firefox 和 Java 中的 verisign 证书。而且我不知道 UNKNOWN 是指 java 中的列表还是指证书颁发机构不被操作系统识别的事实。
我的问题:
- 如果有人能修正我在上述描述中所犯的错误,我将不胜感激。我相信我误解了什么,但我不知道是什么。
- 我简直不敢相信,除非我们支付证书费用,否则 Webstart 将无法工作。我想我们需要的是一种机制,系统管理员可以说他希望办公室 PC 识别给定的证书。有谁知道将来如何做到这一点?
- 如果我们必须购买证书,有人可以告诉我需要注意什么或一般如何运作吗?我可以用同样的方式使用 jarsigner 吗?
- 如果我们必须购买证书,是否有可供我们选择的证书颁发机构列表?显然我想买最便宜的,因为我发现这是一项管理开销。
感谢您的帮助。
最佳答案
我使用 JRE7u40 和 JRE8 的设置是这样的:
我的证书颁发机构 (CA) 有一个自签名证书。此证书必须受系统信任(例如,将其添加到 Java 控制面板/安全/证书/签名者 CA,但可能还有其他方法使您的 CA 受信任)。
然后我有一个由我的 CA 签名的代码发布者证书。我使用此证书签署我的所有代码( jar )。
此外,如果您想要代码的所有权限,我建议将这些 MANIFEST.MF 属性作为 QDH 最小值(如果我记得的话,从 JRE7u40 开始):
Permissions: all-permissions
Codebase: *
Trusted-Library: true
Trusted-Only: true
第一次运行此类应用程序时,您仍会看到安全警告,因为运行时无法确保代码签名者证书未被其 CA 吊销。
但是,现在您可以选择永久接受此发布者(代码签名者证书),如果您这样做,代码签名者证书将添加到受信任的发布者(Java 控制面板/安全/证书/受信任的证书)并且您不会再看到这样的警告。
如果您想避免这一步,我想您必须正确设置您的 CA 基础设施以支持证书撤销验证。我假设在您的 CA 证书中包含一些额外的属性和特殊证书撤销服务的可用性。对于 Intranet 部署,您可以跳过它。
关于java webstart 代码签名要求概述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19479427/