1

我使用 Netbeans IDE 对我的 jar 进行签名。

我使用受信任的证书签署了我的 jar,并在 Netbeans UI 对话框中输入了密钥库详细信息和密钥别名。

产品版本:NetBeans IDE Dev(构建 nbms-and-javadoc-482-on-20130914)Java:1.7.0_25;Java HotSpot(TM) 客户端 VM 23.25-b01 运行时:Java(TM) SE 运行时环境 1.7.0_25-b16


通过单击 jnlp 文件运行,我得到了 Keystore 异常。我想知道用户是否应该手动将证书导入 Java cacerts 密钥库,如此处所述http://docs.oracle.com/javase/tutorial/security/sigcert/index.html#GenCSR

我这样做并得到“证书已添加到密钥库”。Oracle设置的密码是:changeit。但是,当我双击 JNLP 文件时,会弹出“运行时错误。单击以获取详细信息”。我没有得到任何堆栈跟踪。据我所知,Java 控制台没有显示任何错误,只有几行“CacheEntry”。

为什么 Web Start/JNLP 不做这样的事情,所以可怜的用户不必乱用 keytool?

1) jar 文件包含链中的证书。

2) 在 JNLP 文件中有证书条目。

3) 当用户点击 jnlp 文件时,Java 提取证书并将其导入 Java 密钥库,然后运行程序。

但更重要的是,为什么我的程序没有运行?在他们拒绝自签名 jar 之前,它曾经运行良好的 pre-Java 7.21。

更新:

在 Java 控制面板中,我进入了高级,并启用了用于调试和日志记录的跟踪。在 Java 控制台中,我看到

java.lang.SecurityException: invalid SHA1 signature file digest for org/bouncycastle/cert/jcajce/JcaX509CRLHolder.class
    at sun.security.util.SignatureFileVerifier.verifySection(Unknown Source)    
    at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)
    at sun.security.util.SignatureFileVerifier.process(Unknown Source)
    at java.util.jar.JarVerifier.processEntry(Unknown Source)
    at java.util.jar.JarVerifier.update(Unknown Source) 
    at java.util.jar.JarFile.initializeVerifier(Unknown Source)

我也看到

ExitException[ 3]com.sun.deploy.net.FailedDownloadException: Unable to load resource: file:/C:/Users/me/Desktop/dist/lib/bcpkix-jdk15on-149.jar
    at sun.plugin2.applet.JNLP2Manager.downloadResources(Unknown Source)
    at sun.plugin2.applet.JNLP2Manager.prepareLaunchFile(Unknown Source)
    at sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我确实在那个位置看到了 bcpkix-jdk15on-149.jar。

4

2 回答 2

0

我在 NetBeans 7.4 中进行构建,它似乎不允许将额外的标志发送到 jarsigner。我发现了What prevent Java from verify signed jars with multiple signature algorithms

使用新闻组项目中的提示,我解开了三个 BC jar 中的每一个: "C:\Program Files (x86)\Java\jdk1.7.0_40\bin\jar" xvf *.jar

然后我删除了 META-INF 文件夹中的签名文件,并重新将它们重新备份: "C:\Program Files (x86)\Java\jdk1.7.0_40\bin\jar" cmf META-INF\MANIFEST.MF bcpkix -jdk15on-149-mot.jar 组织

它可以运行,但我很惊讶在 Java 控制台中看到这一点:

缺少以下代码库清单属性:file:/C:/Users/me/Desktop/dist/lib/bcprov-ext-debug-jdk15on-149-mot.jar 安全性:使用 CertPath API 基本验证证书链:Plugin2ClassLoader.getPermissions CeilingPolicy allPerms 安全性:JAVAWS AppPolicy 请求权限:file:/C:/Users/me /Desktop/dist/lib/bcprov-ext-debug-jdk15on-149-mot.jar 基本:JNLP2ClassLoader.getPermissions()

基于 http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/no_redeploy.html#permissions

我向罐子添加了属性 Permissions: all-permissions

"C:\Program Files (x86)\Java\jdk1.7.0_40\bin\jar" umf manifest.txt bcprov-ext-debug-jdk15on-149-mot.jar

于 2013-10-12T12:54:39.763 回答
0

升级到 Java 7 Update 45 后 WebVPN Java 插件无法加载,出现以下一般异常错误 - 'com.sun.deploy.net.JARSigningException:在资源中找到未签名条目:

条件:使用 Java 7 Update 45 的 Windows 或 Mac OSX 机器。

解决方法: 1) 在 Java 控制面板 -> 常规 -> 设置中禁用“在我的计算机上保留临时文件”选项。这适用于 Mac OSX 和 Windows。

2) 将 Java 降级到版本 7 Update 40 或以下。

https://blogs.oracle.com/java-platform-group/entry/updated_security_baseline_7u45_impacts

于 2013-12-06T18:31:39.227 回答