使用受信任的证书对 JWS 部署的 jar 文件进行签名
Posted
技术标签:
【中文标题】使用受信任的证书对 JWS 部署的 jar 文件进行签名【英文标题】:Signing a jar file with trusted certificate for JWS deployment 【发布时间】:2013-10-27 19:54:15 【问题描述】:我开发了一个开源程序 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 包含未验证证书链的条目。"
【问题讨论】:
【参考方案1】:[2017 年更新] 来自 Certum 的开源代码签名现在使用加密闪存卡作为私钥,并且必须插入以进行证书激活和安装以及代码签名。密钥费用为 125 美元(+ 运费),仅 1 年的证书费用为 40 美元。您可以要求折扣。
以下是从头开始签署 jar 文件的以下步骤。
说明
英文说明很难找到,而且不是最新的。以下程序基于这两个文件:
Partial Instructions for Installation and Activation (English) - 缺少关于文件“bundle.pem”的部分。 Complete Instructions for Installation and Activation (Polish)创建、激活和安装您的证书:
-
访问"OpenSource Code Signing" section 中的“Certum 认证”网站并订购您的证书。
收到加密闪存卡后(我花了 15 天),插入它,从卡上安装驱动程序和 proCertum CardManager 软件。
转到您的 Certum 帐户并按照您新订购的证书的激活过程进行操作。
提示: CryptoAgent Java Web Start 应用程序仅在 JDK(而非 JRE)
-
您将收到一封邮件,要求您提供一些官方文件(身份证、租金账单等)和电子邮件验证程序。
发送激活所需的文件和信息。您将收到另一封要求安装证书的邮件(验证在 1 小时内完成)。
按照将证书存储在卡上的过程在加密卡上安装证书(参见英文说明,第 4 部分)
获取文件“bundle.pem”
此文件对于在签署您的应用程序时获得有效的证书链是必需的(请参阅波兰语说明中的第 7.1.2 部分)。
基本上,它包括在纯文本格式文件中连接 1) 您的证书和 2) Certum 代码签名 CA SHA2 公钥。
-
打开 proCertum CardManager >> 读卡 >> 标签 Common >> 选择您的证书并点击“显示详细信息”
导出您的证书:x509 - base-64
下载 PEM 格式的 Certum Code Signing CA SHA2(来自 Certum 的 list of root certificates)。
通过连接这 2 个证书(第一个是您的证书,第二个是 Certum 证书)创建文本文件“bundle.pem”。
使用 Jarsigner 签署您的 jar 文件
-
按照英文说明第 7.2 点的说明创建“provider.cfg”文件。
您需要证书的别名(而不是所有者名称)来签署您的 jar。要获取它,请执行以下命令:
keytool -list -v -keystore NONE -storetype PKCS11 -providerClass sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]"
-
准备好 alias、provider.cfg 和 bundle.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 task。
【讨论】:
就是这样,谢谢!从 P12 获得正确的别名对我来说是缺失的部分。通过这个过程,我从 Certum 工作中获得了我的免费开源证书。 请确保对操作 1 到 5 使用相同的 Chrome。第 2 步在 Chrome 中安装了第 4 步(及以后)所需的东西(我认为它是公钥/私钥对) .尝试在用于第 2 步的浏览器上完成第 4 步(及以后)将失败并出现错误。 在 Linux 上,Chrome 在导出密钥时无法包含证书链。所以第 6 步将导出一个不完整的 .pfx 密钥。要获得完整的密钥,您必须从 Certum 获取这两个文件:certum.eu/upload_module/downloads/certum/certyfikaty/nowe/… 和 certum.pl/CA.crt,在 KeyTool GUI 中打开不完整的 .pfx 密钥,右键单击该密钥,选择“编辑证书链 > 附加证书”并添加 l3 .crt,再次右键单击密钥,选择“编辑证书链>附加证书”并添加CA.crt。保存并退出。现在您的密钥已准备好执行第 7 步和第 8 步了。 JWS:当客户端访问JNLP
文件时。从 Web 下载和运行 Java 应用程序(Signed 和认证)。 Configure untrusted
Exception Site List
中的 Java-App URL 作为 https://hostname.example.com:8088
从 WEB 运行。 Example
【参考方案2】:
我想我终于按照这个程序做到了:
通过其网站界面在 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 上签名【讨论】:
“将私钥导出为 .pfx” 使用 SDK 密钥工具?您能否详细说明发出的命令? 我更改了描述以提供更多详细信息。而且我看到我可以直接从 Chrome 创建一个完整的 p12,而不需要 KeyTool GUI。我已将这个新签名的 jar 重新部署为测试版本。 “将私钥作为 .pfx 从 Chrome 导出(设置,管理证书..” 嗯?我在 Chrome 版本 30.0.1599.101 m 中没有看到类似的选项。 . 还有 Chrome 30.0.1599.101 m,在 Win 7 下:在“设置”选项卡中,我首先单击“显示高级设置”以显示更多设置。然后,在“HTTP/SSL”部分(在“下载”和“谷歌云打印”之间),我有一个“管理证书...”按钮。你没有这个?【参考方案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 显示一个错误。
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=巴黎, ST=法国, C=FR过时的 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>
【讨论】:
非常感谢您的链接和分析。我不知道 JaNeLA,这是清理 jnlp 文件的非常方便的工具。 site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp 仍然是使用自签名 jar 进行安装的 JNLP,因此出现警告并且无法一劳永逸地信任应用程序是正常的。 site4145.mutu.sivit.org/WikiCleaner/WikiCleanerTest.jnlp 是测试 JNLP,应用程序使用 Certum 提供的我的证书签名。如果您想尝试一下,它现在应该可以正常工作了。【参考方案4】:在 Linux 上,以下过程对我有用。它基于 Eric David 的回答。
获取您的证书
访问“Certum 认证”网站的“开源代码签名”部分。购买证书并按照创建程序进行操作。
获取代码签名的公钥
获取Public Key of Certum Code Signing CA,可能是CA SHA2 密钥cscasha2.cer。
将证书转换为 pkcs12 格式
将您自己的证书(您从 Certum 获得的证书)导入 Firefox: 菜单项设置 - 高级 - 证书 - 显示证书。 导入 CA SHA2 公钥(由 Certum 用于签署您的证书): 选项卡证书。当局 - 进口。 验证。它应该表明它已经过验证: tab own certificate - show. 导出证书:标签自己的证书 - 保存 - 为 pkcs12(例如到 mycert.p12)从pkcs12格式转换为jks格式
找到您的 pkcs12 文件中使用的别名。它将类似于“unizeto technologies s.a. 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 应用程序库允许代码库:URL使用以下命令签署您的 jar 文件:
jarsigner -keystore mycert.jks -tsa http://time.certum.pl FILENAME.jar SHORTALIAS
【讨论】:
如果 Firefox 没有导出证书“无法创建 PKCS #12 备份文件,原因不明。”请改用pk12util。【参考方案5】:我今天用这个解决了同样的问题:
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,无法一劳永逸地接受申请。【参考方案6】:如here 所述,要删除 UNKNOWN PUBLISHER 警告,您可以将用于签署 jar 的证书添加到 Java 控制面板的 Signer Jar 中:配置 Java -> 安全 -> 管理证书 -> Signer Jar 选项-> 导入。
【讨论】:
以上是关于使用受信任的证书对 JWS 部署的 jar 文件进行签名的主要内容,如果未能解决你的问题,请参考以下文章