使用 JWS 部署的受信任证书对 jar 文件进行签名

我开发了一个开源程序WPCleaner,它通过Java Web Start分发。当前版本可在 http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp

随着Java中最近的更新,当您需要应用程序具有一些权限(在首选项中写入,访问其他网站等)时,通过Java Web Start部署Java应用程序变得越来越困难。

我的应用程序是自签名的,这在以前是可以的,但是新的更新要求用户在每次运行应用程序时都接受该应用程序,而不仅仅是一劳永逸地接受它。因此,我决定使用受信任的证书对我的应用程序进行签名。

我从Certum那里得到了一个(显然,它们对开源开发人员是免费的),遵循这个讨论:开源项目的代码签名证书?

我已经生成了一个新的jar文件,用这个证书签名(jar文件在 http://site4145.mutu.sivit.org/WikiCleaner/WikipediaCleanerTest.jar 可用),但我仍然有问题:当我通过JWS启动应用程序时,Java仍然显示一个警告窗口,不允许我一劳永逸地信任该应用程序。编辑器仍显示为“未知”,但当我查看消息的详细信息时,正在使用的是我来自 Centrum 的新证书。

有没有人知道我做错了什么?我认为拥有来自受信任的CA的证书(Centrum似乎在Java cacerts中)将允许用户一劳永逸地接受证书。

谢谢

PS:当我运行时,我收到以下警告“此jar包含证书链未验证的条目。jarsigner -verify


答案 1

[2017年更新]来自Certum的开源代码签名现在使用加密闪存卡作为私钥,并且必须插入证书激活和安装以及代码签名。密钥成本为125美元(+运费),仅1年证书的费用为40美元。您可以要求折扣。


以下是从头开始对 jar 文件进行签名的步骤。

指示

英文说明很难找到,而且不是最新的。以下过程基于以下 2 个文档:

创建、激活和安装证书:

  1. 访问“Certum 认证”网站的“开源代码签名”部分,订购证书。
  2. 收到加密闪存卡后(对我来说花了15天),请插入它,从卡中安装驱动程序和proCertum CardManager软件。
  3. 转到您的 Certum 帐户,然后按照新订购的证书的激活过程进行操作。

提示:CryptoAgent Java Web Start 应用程序仅使用 JDK(不是 JRE)< 9(即 JDK 7 或 8)运行。

  1. 您将收到一封邮件,要求您提供一些官方文件(身份证,租金账单等)和电子邮件验证程序。
  2. 发送激活所需的文档和信息。您将收到另一封要求安装证书的邮件(验证在 1 小时内完成)。
  3. 按照将证书存储在卡上的过程在加密卡上安装证书(请参阅英文说明,第 4 部分)

获取文件“bundle.pem”

在对应用程序进行签名时,此文件对于获取有效的证书链是必需的(请参阅波兰语说明中的第 7.1.2 部分)。

基本上,它包括以纯文本格式文件1)您的证书和2)Certum代码签名CA SHA2公钥进行连接。

  1. 打开 proCertum CardManager >> 读取卡>> 选项卡 常见 >> 选择您的证书,然后单击“显示详细信息”
  2. 导出证书:x509 - base-64
  3. 下载 PEM 格式的 Certum 代码签名 CA SHA2(从 Certum 的根证书列表中)。
  4. 通过连接这两个证书(首先是您的证书,其次是 Certum 证书)来创建文本文件“bundle.pem”。

使用 Jarsigner 对 jar 文件进行签名

  1. 按照英语说明的第 7.2 点所述创建“提供程序.cfg”文件。
  2. 您需要证书的别名(而不是所有者名称)来对 jar 进行签名。要获取它,请执行以下命令:
keytool -list -v -keystore NONE -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]"
  1. 准备好别名提供程序.cfgbundle.pem 文件后,只需使用以下命令对 jar 进行签名即可:
jarsigner -keystore NONE -certchain "bundle.pem" -tsa "http://time.certum.pl" -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]" "[your_code].jar" "[your_alias]"

就个人而言,我使用 Ant 脚本对我的应用程序 jar 文件进行签名。请参阅 ANT 项目中的 signjar 任务


答案 2

我想我终于按照这个程序做到了:

  • 通过Certum的网站界面在Chrome中安装了Certum提供的证书
  • 从Chrome将私钥导出为.pfx(设置,管理证书,导出,导出私钥,PKCS#12等)
  • 使用KeyTool GUI(用于keytools的Java前端GUI)创建完整的p12:导入Certum根证书作为可信证书,导入中间证书作为可信证书,导入我的.pfx作为密钥对
  • 用这个p12签名罐子

似乎对我有用,我正在等待其他用户的反馈,以确保它也适合他们。

编辑:我再次尝试从Chrome导出证书,我看到有一个选项可以在导出中包含证书链。在执行此操作时,我甚至不需要在之后使用KeyTool GUI。我已经重新部署了用这个新的p12签名的测试版本:

  • 通过Certum的网站界面在Chrome中安装了Certum提供的证书
  • 从Chrome将私钥导出为.pfx(设置,管理证书,导出,导出私钥,PKCS#12 +包含证书链等)
  • 用这个p12签名罐子

推荐