18

我开发了一个开源程序 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 包含未验证证书链的条目。”

4

6 回答 6

10

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


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

指示

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

创建、激活和安装您的证书:

  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 >> Read Card >> tab Common >> 选择您的证书并单击“显示详细信息”
  2. 导出您的证书:x509 - base-64
  3. 下载 PEM 格式的Certum 代码签名 CA SHA2(从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. 准备好aliasprovider.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 任务

于 2013-10-28T10:24:53.453 回答
6

我想我终于设法按照以下程序做到了:

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

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

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

  • 通过他们的网站界面在 Chrome 中安装了 Certum 提供的证书
  • 从 Chrome 将私钥导出为 .pfx(设置、管理证书、导出、导出私钥、PKCS#12 + 包括证书链,...)
  • 用这个 p12 在 jar 上签名
于 2013-10-21T19:13:46.700 回答
3

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

基于 JaNeLA 的文件 - 有效的 JNLP。WikiCleanerTest最重要的知名出版商..

在此处输入图像描述

所以有一个结果是“似乎在这里可以识别发布者”。出色的工作,感谢您对过程的描述。

效果比我之前看过的那个好多了。:P


Jarsigner - 验证

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 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 验证和带有调整的更正版本。

发射

但这是真正的坏消息:

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

以下是证书的一些详细信息:

  • 尼古拉斯·维维尔 (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

这是上面验证的 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>
于 2013-10-22T00:27:24.483 回答
2

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

获取您的证书

转到“开源代码签名”部分的“Certum 认证”网站。购买证书并遵循创建程序。

获取代码签名的公钥

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

将证书转换为 pkcs12 格式

  • 将您自己的证书(您从 Certum 获得的证书)导入 Firefox:
    菜单项设置 - 高级 - 证书 - 显示证书。
  • 导入 CA SHA2 公钥(由 Certum 用于签署您的证书):
    tab cert. 当局 - 进口。
  • 核实。它应该告诉它已经过验证:
    标签自己的证书 - 显示。
  • 导出证书:
    选项卡自己的证书 - 保存 - 为 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

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

jarsigner -keystore mycert.jks -tsa http://time.certum.pl FILENAME.jar SHORTALIAS
于 2016-02-22T01:33:23.483 回答
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: *
于 2013-10-18T20:44:26.750 回答
0

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

于 2015-07-25T14:28:17.523 回答