签署 Java 桌面应用程序

Posted

技术标签:

【中文标题】签署 Java 桌面应用程序【英文标题】:Signing Java desktop application 【发布时间】:2018-01-16 02:13:27 【问题描述】:

我使用 Swing (myProg.jar) 制作了一个 Java 桌面应用程序。我目前为我的 Mac 用户将我的应用程序打包为 .app,并使用 InnoSetup 为我的 Windows 用户制作 setup.exe 文件。我还提供了一个 myProg.exe 包装器来启动 myProg.jar。

现在,为了摆脱用户计算机的 SmartScreen 和其他保护措施,我认为我需要对我的应用程序进行签名。但我读得越多,我就越感到困惑。

谁能帮我澄清以下几点?

1) 我到底需要什么样的证书?有没有办法让它免费或至少便宜?

2) 我到底需要什么签名?我应该签署 myProg.jar 文件还是 .app 文件?安装程序.exe? myProg.exe 包装器?全部?

3) 已解决 - 当我将更新我的程序并将 myProg.jar 替换为新版本的 myProg.jar 时,它将如何工作?

非常感谢!

【问题讨论】:

netbeans.org/kb/docs/java/javase-deploy.html 感谢您的回答,但我不确定它是否有帮助。这是使用 Java Web Start 的建议吗? 这不是一个答案,我是在建议它,这就是为什么我把它作为评论 好的。但我的问题更多关于签名,而您的回答更多关于部署。我已经有了我的部署策略。 【参考方案1】:

您的 JDK 应包含名为 jarsigner 的工具。此工具可让您免费签署 jar 文件。

1) 您用于签名的密钥需要在 java 密钥库中(默认为.keystore)您可以将密钥从.der 格式导入您的密钥库。

2) 您只能签署.jar 文件

3) 它只会用新签名的文件覆盖旧文件。就像简单的副本一样。除非您的安装程序这样做,否则不会执行签名验证。

此外,并非每个签名都是相同的。例如,如果您尝试注册加密提供者,则需要 Oracle 签名的签名才能在 Oracle JVM 上运行它。看: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider.html#Step6

示例:

生成密钥:

keytool -genkey -keyalg RSA -alias key_alias -keystore mystore.keystore -keysize 2048

给罐子签名:

jarsigner -keystore mystore.keystore -tsa http://tsa.safecreative.org MyJARFile.jar key_alias_from_keystore

验证签名:

jarsigner -verify jar-file

我不确定这是否能解决我们的问题。总的来说,您需要做的是 sign os 可执行文件。在这种情况下.exe.app

一个可能的解决方案是签署您的应用程序包装器的可执行文件(在 Windows .exe 的情况下)。为此,请参阅:https://msdn.microsoft.com/en-us/library/aa387764.aspx

在您使用基于 Unix 的系统时,我会尝试运行 Mono 的签名工具。请参阅“signcode”上的单声道文档(我无法提供链接,没有足够的代表)

这应该消除“未知发布者”消息,但除非您可以让操作系统开发人员签署您的证书,否则将向用户显示一些消息。

【讨论】:

这已经比我迄今为止所能找到的任何东西都更加清晰。谢谢。不过,我需要更多细节。关于 jarsigner,我应该只自动生成我的证书吗?喜欢keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -keysize 2048?关于 SignTool,我没有得到我需要的那种证书。 由于我使用的是 GNU/Linux,我应该使用 ***.com/questions/18287960/…,但我仍然没有获得我应该用来摆脱 SmartScreen 的那种证书... 是的,您可以生成您的证书。 keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -keysize 2048 就可以了。 好的,我成功签署了我的 jar 文件。我有一个myApp.jar.sig 文件。我该怎么办? @Sharcoux 你什么都不用做。 jar 文件已经签名。请点击此链接,了解更多信息:docs.oracle.com/javase/tutorial/deployment/jar/signing.html

以上是关于签署 Java 桌面应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Netbeans中JAVA桌面应用程序?

Java桌面端程序开发

Java桌面应用程序设计:SWT简介

签署小程序并部署到内网

如何使用现有的 .cer、.p12 或 .pfx 证书签署应用程序?

用JAVA语言能开发桌面应用程序吗?