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

时间:2013-10-18 20:39:18

标签: java certificate java-web-start code-signing

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

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

我的应用程序是自签名的,之前还可以,但是新的更新要求用户在每次运行时都接受应用程序,而不仅仅是一次性,如果他们愿意的话。所以,我决定使用可靠的证书来签署我的申请。

我从Certum那里得到了一个(显然,他们对开源开发人员是免费的),在讨论之后:Code signing certificate for open-source projects?

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

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

由于

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

6 个答案:

答案 0 :(得分:10)

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


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

<强>说明

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

创建,激活和安装证书:

  1. 访问"OpenSource Code Signing" section中的“Certum认证”网站并订购您的证书。
  2. 收到加密闪存卡后(我花了15天),插上卡片,安装驱动程序和卡上的 proCertum CardManager 软件。
  3. 转到您的Certum帐户并按照新订购的证书的激活过程进行操作。
  4.   

    提示:CryptoAgent Java Web Start应用程序仅使用JDK(而非JRE)&lt; 9(所以,JDK 7或8)。

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

      此文件对于在签署您的申请时获取有效的证书链是必需的(参见波兰语说明中的第7.1.2部分)。

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

      1. 打开 proCertum CardManager &gt;&gt; 读卡&gt;&gt;标签通用&gt;&gt;选择您的证书,然后单击“显示详细信息”
      2. 导出您的证书:x509 - base-64
      3. 以PEM格式下载Certum Code Signing CA SHA2(来自Certum的list of root certificates)。
      4. 通过连接这两个证书(首先是您的证书,第二个是Certum证书)来创建文本文件“bundle.pem”。
      5. 使用Jarsigner签署您的jar文件

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

答案 1 :(得分:6)

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

  • 通过其网站界面安装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。

答案 2 :(得分:3)

  

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

基于JaNeLA的文件 - 有效的JNLP。最重要的是WikiCleanerTest已知发布商 ..

enter image description here

所以有一个'似乎在这里工作以识别出版商'的结果。伟大的工作,并感谢对过程的描述。

比我之前看过的效果好得多。 :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包含未验证证书链的条目。

..可以忽略。

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 <offline-allowed /> 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

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

启动

但这是真正的坏消息:

UNKNOWN publisher UNKNOWN publisher - More Info.

以下是证书的一些细节:

  • Nicolas Vervelle(Nicolas Vervelle)

    • 主题 CN = Nicolas Vervelle, OU = WikipediaCleaner, O = WikipediaCleaner, L =巴黎, ST =法国, C = FR

Out of Date Java

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

Out Of Date Java

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

JNLP

以上是经过验证的JNLP:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
  <information>
    <title>WPCleaner</title>
    <vendor>User:NicoV</vendor>
    <description>WPCleaner</description>
    <description kind="short">A tool for Wikipedia maintenance</description>
    <homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
    <icon href="commons-nuvola-web-broom.png"/>
    <shortcut>
      <desktop/>
    </shortcut>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <j2se version="1.5.0+" java-vm-args="-Xmx512M"/>
    <jar href="WikipediaCleaner.jar" download="eager" main="true"/>
  </resources>
  <application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>

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

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
  <information>
    <title>WPCleaner</title>
    <vendor>User:NicoV</vendor>
    <!-- Should be here.. -->
    <homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
    <description>WPCleaner</description>
    <description kind="short">A tool for Wikipedia maintenance</description>
    <icon href="commons-nuvola-web-broom.png"/>
    <shortcut>
      <desktop/>
    </shortcut>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <!-- the micro-version request might be triggering the 
    Out-Of-Date Java version warning -->
    <j2se version="1.5+" java-vm-args="-Xmx512M"/>
    <jar href="WikipediaCleaner.jar" download="eager" main="true"/>
  </resources>
  <application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>

答案 3 :(得分:2)

在Linux上,以下过程对我有用。它基于Eric David的答案。

获取证书

继续进行&#34; Certum认证&#34;网站在&#34; OpenSource Code Signing&#34;部分。购买证书并按照创建程序进行操作。

获取代码签名的公钥

获取Public Key of Certum Code Signing CA,可能是CA SHA2密钥cscasha2.cer

将证书转换为pkcs12格式

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

从pkcs12格式转换为jks格式

找到pkcs12文件中使用的别名。它将类似于&#34; unizeto technologies s.a. id von open source developer,YOUR NAME &#34;。

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
  • 权限:所有权限
  • 代码库:网址
  • Application-Library-Allowable-Codebase:URL

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

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

答案 4 :(得分:0)

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

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: *

答案 5 :(得分:0)

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