8

有没有人这样做过?我在谷歌上找到的唯一参考是:http: //onjava.com/onjava/2001/04/12/signing_jar.html仍然使用 sun.* 会导致问题的类......

也发现了这个,但不适用于 java16:https ://svn.cs.cf.ac.uk/projects/whip/trunk/whip-core/src/main/java/org/whipplugin/data/bundle/ JarSigner15.java

4

5 回答 5

4

为了解决 Java 7u45 中 WebStart 应用程序中安全限制的突然变化,我们创建了一个简单的签名 jar 文件生成器。它使用 Guava 15 和 Bouncy Castle bcpkix 模块。它应该在 Java 6 和 7 上运行。它只适用于小文件。将其用于您想要的任何目的。

于 2013-10-21T17:00:53.513 回答
3

请注意,sun.security.tools.JarSigner该类是为用作命令行实用程序而编写的,并非旨在从 Java 代码中调用。结果,错误处理非常突然:代码将简单地将错误消息打印到标准输出,然后调用System.exit() 1

这意味着,如果您从 Java 代码中调用该类并且在您尝试对 jar 签名时发生错误,则运行您的代码的 JVM 将简单地停止。根据您的情况,这可能没问题,但是如果您的代码长时间运行或充当服务,那就不太好了。

因此,最好根据钳位的注释使用 ProcessBuilder 调用 jarsigner 工具。然后,您可以调用waitFor()生成的 Process 对象并检查exitValue()命令是否成功。getInputStream()如果操作失败,将让您读取写入标准输出的任何错误消息。

于 2014-06-19T01:33:27.190 回答
2

在 tools.jar 文件中是 sun.security.tools.JarSigner 类,它有一个静态 run(ava.lang.String[] strings) 方法,它采用与 jarsigner 可执行文件相同的参数。

所以你可以这样称呼:

sun.security.tools.JarSigner.run(new String[] {
    "-keystore", keystoreFile.getAbsolutePath(),
    "-storepass", keystorePassword,
    outFile.getAbsolutePath(),
    keystoreAlias 
});

您需要确保 tools.jar 在您的类路径中以进行编译和执行。

于 2012-06-22T15:06:28.220 回答
1

以下是使用 JDK 9 及更高版本执行此操作的方法:

import java.io.*;
import java.util.zip.*;
import java.security.*;
import jdk.security.jarsigner.*;

char[] password = ...;
String keyStorePath = ...;
KeyStore ks = KeyStore.getInstance(new File(keyStorePath), password);
KeyStore.ProtectionParameter protParam =
   new KeyStore.PasswordProtection(password);

KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry)
   ks.getEntry("codecheck", protParam);

JarSigner signer = new JarSigner.Builder(pkEntry)
   .build();
String inputFile = ...;
String outputFile = ...;
try (ZipFile in = new ZipFile(inputFile);
      FileOutputStream out = new FileOutputStream(outputFile)) {
   signer.sign(in, out);
}

于 2021-03-07T14:59:26.873 回答
0

我正在使用SingJar Ant 任务(它显然调用了下面的命令行工具)。应该可以以编程方式调用它。

于 2011-10-07T15:13:57.463 回答