如何签署跨平台的Java应用程序

4
我有一个使用Java编写的应用程序,将在Mac OS X、Windows和Linux上分发。目前,我正在按照以下方式为每个平台打包应用程序(但如果需要替代方案,我愿意进行更改):
  • Mac OS X:使用Eclipse,转到“文件”->“导出...”,选择Mac OS X应用程序包
  • Windows:使用Launch4j将jar文件打包成exe文件
  • Linux:使用Jnix将jar文件打包成sh文件
问题在于,我的程序开始遇到不被信任的问题。Google Chrome报告说我的应用程序的beta版本不是来自可信源,Windows 8 Smartscreen过滤器也是如此。据我了解,让这些安全措施信任我的应用程序(如果我想真正地分发它,这肯定是必要的)的唯一方法是对应用程序进行签名。然而,我发现关于如何做到这一点的文档非常少,大多数文档都是针对一个平台的(例如this告诉我如何为Windows 8签名)。
我的问题是:是否有一种方法可以对我的Java代码进行签名,从而自动签名我创建的可执行文件?还是我必须单独对每个可执行文件进行签名?如果是后者,是否有一个代码签名机构可以使用,还是我必须与不同的组分别签署?

您可以对jar文件本身进行签名:Oracle文档 -- 对于.exe文件,使用微软的签名工具signtool sign /a MyFile.exe。对于OS X,请尝试使用此命令codesign -v -f -s SIGNING_ID_APP --entitlements YourApp.entitlements YourApp.app 苹果文档 - isaacparrot
那么我需要同时签署jar和.exe/.app文件吗?我需要为每个文件使用不同的证书还是可以使用相同的证书? - Thunderforge
据我所知,如果您签署最终产品,则不需要在内部签署Jar文件,但即使您签署Jar文件,它也应该起作用。您可以使用.pfx Microsoft有关个人信息交换的文档对.exe和.app都进行签名。要获得此证书,您必须通过由OS X和Windows都信任的第三方颁发,或者自己生成该证书。我不知道是否有任何第三方会这样做...但也许这就是您正在寻找的内容? - isaacparrot
经过一些研究,看起来一些值得信赖的第三方证书颁发机构包括VeriSign、DigiCert、TC TrustCenter、Comodo、GoDaddy、GlobalSign和StartCom(来源:维基百科)--这是DigiCert的页面 - isaacparrot
1个回答

4

ParrotMac的建议下,我最终进行了Digicert的实时聊天,并向“David”提出了一些问题。这是他的回答(为了清晰起见进行了编辑):

我需要对Java代码还是最终产品可执行文件进行身份验证,或者两者都需要?

您需要对最终产品进行签名。

我购买一个证书并将其用于其他平台,还是分别购买它们?

您可以购买代码签名证书,将其下载到您选择的平台(例如Java jar文件),然后重新键入另一个平台(例如Windows .exes的认证码),如果您愿意。重新键入是免费的,并且只要证书有效,您就可以将证书重新键入不同的平台。当您重新键入时,不会使您之前的证书无效,只是使您能够为不同的平台下载另一个证书。您在digicert上选择的平台只是最初针对该平台进行密钥处理。

我的其中一个平台目标是Linux。是否有Linux代码签名?还是仅适用于OS X和Windows?

您可以在Linux中使用证书,但签名工具与Windows或OS X不同。因此,至少从digicert(我认为其他代码认证公司也是如此),您可以购买一个证书并在多个平台上免费使用。然后,您可以验证最终产品;验证原始jar文件是不必要的,除非您以这种方式分发它。但是,我发现如果您想超越Windows 8,您需要获得更安全的代码签名。要通过Windows 8 Smartscreen过滤器,您需要EV Code Signing证书。EV的成本更高,但主要是由于附带的额外验证。您可以像使用非EV证书一样使用EV。出于谨慎起见,我询问了一下,如果将其发送到Mac OS X应用商店或其他商店,是否需要证书。如果需要,是否是同一个证书?
对于像Google应用商店或Mac App Store这样的商店,您需要通过受信任的证书签名您的软件。但是您需要查看特定商店的要求以确定您需要什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接