有没有人这样做过?我在谷歌上找到的唯一参考是: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
有没有人这样做过?我在谷歌上找到的唯一参考是: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
为了解决 Java 7u45 中 WebStart 应用程序中安全限制的突然变化,我们创建了一个简单的签名 jar 文件生成器。它使用 Guava 15 和 Bouncy Castle bcpkix 模块。它应该在 Java 6 和 7 上运行。它只适用于小文件。将其用于您想要的任何目的。
请注意,sun.security.tools.JarSigner
该类是为用作命令行实用程序而编写的,并非旨在从 Java 代码中调用。结果,错误处理非常突然:代码将简单地将错误消息打印到标准输出,然后调用System.exit()
1。
这意味着,如果您从 Java 代码中调用该类并且在您尝试对 jar 签名时发生错误,则运行您的代码的 JVM 将简单地停止。根据您的情况,这可能没问题,但是如果您的代码长时间运行或充当服务,那就不太好了。
因此,最好根据钳位的注释使用 ProcessBuilder 调用 jarsigner 工具。然后,您可以调用waitFor()
生成的 Process 对象并检查exitValue()
命令是否成功。getInputStream()
如果操作失败,将让您读取写入标准输出的任何错误消息。
在 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 在您的类路径中以进行编译和执行。
以下是使用 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);
}
我正在使用SingJar Ant 任务(它显然调用了下面的命令行工具)。应该可以以编程方式调用它。