为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仍然会显示一个警告窗口,让我一劳永逸地信任该应用程序。 编辑器仍然显示为UNKNOWN,但是当我查看消息的详细信息时,这是我从Centrum使用的新证书。

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

谢谢

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

[更新2017]从Certum开源代码签名现在使用加密闪存卡作为私钥,必须插入以进行证书激活和安装,以及代码签名。 关键成本125美元(+运费)和1年证书单独花费40美元。 你可以要求折扣。


以下是从头开始签署jar文件的以下步骤。

说明

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

  • 安装和激活的部分说明(英语) – 缺少关于文件“bundle.pem”的部分。
  • 完整的安装和激活说明(波兰语)

创建,激活和安装证书:

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

提示: CryptoAgent Java Web Start应用程序仅在JDK(而不是JRE)<9(因此,JDK 7或8)下运行。

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

获取文件“bundle.pem”

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

基本上,它包括以纯文本格式文件连接1)您的证书和2) Certum Code Signing CA SHA2公钥。

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

使用Jarsigner签署您的jar文件

  1. 按照英语说明的第7.2点中的说明创建“provider.cfg”文件。
  2. 您需要证书的别名 (而不是所有者名称 )来签署您的jar。 要获取它,请执行以下命令:
 keytool -list -v -keystore NONE -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]" 
  1. 获得别名后 ,准备好provider.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任务 。

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

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

似乎为我工作,我正在等待其他用户的反馈,以确保它也适用于他们。

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

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

我正在等待其他用户的反馈,以确保它也适用于他们。

基于JaNeLA的文件 – 有效的JNLP。 最重要的是WikiCleanerTest的出版商 ..

在此处输入图像描述

因此,有一个结果“似乎在这里用于识别出版商”。 干得好,谢谢你对这个过程的描述。

比我之前看过的效果好得多。 :P


Jarsigner -verify

 s 292828 Sun Oct 20 17:57:58 EST 2013 META-INF/MANIFEST.MF 292645 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.SF 2017 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.RSA 0 Sun Oct 20 17:57:52 EST 2013 META-INF/ 0 Wed Feb 11 15:04:50 EST 2009 META-INF/maven/ .. 0 Sun Oct 20 17:57:32 EST 2013 org/xnap/commons/i18n/ sm 2837 Thu Sep 09 16:00:54 EST 2004 META-INF/info.xml .. sm 214 Wed Feb 11 00:57:02 EST 2009 org/xnap/commons/i18n/LocaleChangeListener.class s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified. Warning: This jar contains entries whose certificate chain is not validated. Re-run with the -verbose and -certs options for more details. 

我理解警告:

此jar包含未validation证书链的条目。

..可以忽略。

JaNeLA报告

JaNeLA显示一个错误。

 JaNeLA Report - version 11.05.17 Report for http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp cvc-complex-type.2.4.a: Invalid content was found starting with element 'homepage'. One of '{description, icon, offline-allowed, shortcut, association, related-content}' is expected. cvc-complex-type.2.4.a: Invalid content was found starting with element 'homepage'. One of '{description, icon, offline-allowed, shortcut, association, related-content}' is expected. XML encoding not known, but declared as utf-8 Codebase + href 'http://site4145.mutu.sivit.org/WikiCleaner.jnlp' is not equal to actual location of 'http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp'. Desktop icons were subject to bug nnnn in earlier J2SE versions Optimize this application for off-line use by adding the  flag. 'short' description is longer than 'default' description. Downloads can be optimized by specifying a resource size for 'WikipediaCleaner.jar'. The resource download at WikipediaCleaner.jar can be optimized by removing the (default) value of download='eager'. Lazy downloads might not work as expected for WikipediaCleaner.jar unless the download 'part' is specified. Resource type png of resource commons-nuvola-web-broom.png is not one of the allowable types of gif, jpg, jpeg. Downloads can be optimized by specifying a resource size for 'commons-nuvola-web-broom.png'. Icon loading & use can be optimized by specifying the width and height for commons-nuvola-web-broom.png 

请参阅下面的JNLPvalidation和带有调整的更正版本。

发射

但这是真正的坏消息:

未知的出版商UNKNOWN出版商 - 更多信息

以下是证书的一些细节:

  • Nicolas Vervelle(Nicolas Vervelle)

    • 主题: CN = Nicolas Vervelle,OU = WikipediaCleaner,O = WikipediaCleaner,L = Paris,ST = France,C = FR

过时的Java

这是一个奇怪的警告,我不明白..

过时的Java

该应用程序。 请求1.5.0+,因此任何1.7+版本都应该被接受。
它声称要求1.6(可能是因为我没有安装1.5运行时)。 我唯一能想到的是触发警告是包含一个微型版本,这是不必要的。

JNLP

以下是经过validation的JNLP:

    WPCleaner User:NicoV WPCleaner A tool for Wikipedia maintenance                

这是建议的替代品。 根据JaNeLA(条形警告,我们可以忽略),它是有效的。 它还包括对最小版本属性的另一个调整。

    WPCleaner User:NicoV   WPCleaner A tool for Wikipedia maintenance                

在Linux上,以下过程适用于我。 它基于Eric David的回答。

获得证书

在“OpenSource代码签名”部分中访问“Certum认证”网站。 购买证书并按照创建程序进行操作。

获取代码签名的公钥

获取Certum Code Signing CA的公钥,可能是CA SHA2密钥cscasha2.cer 。

将证书转换为pkcs12格式

  • 将您自己的证书(从Certum获得的证书)导入Firefox:
    菜单项设置 – 高级 – 证书 – 显示证书。
  • 导入CA SHA2 puplic密钥(Certum用于签署证书):
    标签证书。 当局 – import。
  • 校验。 它应该告诉它已经过validation:
    标签自己的证书 – 显示。
  • 导出证书:
    tab自己的证书 – 保存 – 作为pkcs12(例如,到mycert.p12)

从pkcs12格式转换为jks格式

找到pkcs12文件中使用的别名。 它将类似于“ unizeto technologies sa id von open source developer,YOUR NAME ”。

 keytool -list -v -storetype pkcs12 -keystore mycert.p12 > out.txt grep Aliasname out.txt 

然后将pkcs12文件转换为java的jks格式。 这个步骤可以省略,但一旦完成就很方便了。

 keytool -importkeystore -srckeystore mycert.p12 -srcstoretype pkcs12 -srcalias "ALIASNAME" -destkeystore mycert.jks -deststoretype jks -deststorepass PASSWORD -destalias SHORTALIAS 

签署你的jar文件

为避免向webstart用户发出警告,jar清单文件应包含以下属性:

  • 应用程序名称:APPNAME
  • 权限:所有权限
  • 代码库:URL
  • Application-Library-Allowable-Codebase:URL

使用以下命令对jar文件进行签名:

 jarsigner -keystore mycert.jks -tsa http://time.certum.pl FILENAME.jar SHORTALIAS 

我今天解决了同样的问题:

 Manifest-Version: 1.0 Trusted-Library: true Application-Library-Allowable-Codebase: * Trusted-Only: false Application-Name: My app Permissions: all-permissions Created-By: 1.6.0_16 (Sun Microsystems Inc.) Caller-Allowable-Codebase: * Codebase: * 

如此处所述,要删除UNKNOWN PUBLISHER警告,您可以将用于签署jar的证书添加到Java控制面板的Signer Jar中:配置Java – >安全性 – >管理证书 – > Signer Jar选项 – >导入。