如何在 Java 中以编程方式签署 jar 文件?

问题描述 投票:0回答:5

有人做过吗?我在谷歌上找到的唯一参考是:https://web.archive.org/web/20150423130641/http://www.onjava.com/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/束/JarSigner15.java

java jar digital-signature jar-signing
5个回答
5
投票

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


3
投票

请注意,

sun.security.tools.JarSigner
类被编写为用作命令行实用程序,并非设计为从 Java 代码调用。因此,错误处理非常突然:代码将简单地将错误消息打印到标准输出,然后调用
System.exit()
1.

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

因此,最好根据 clamp 的评论使用 ProcessBuilder 调用 jarsigner 工具。然后,您可以在生成的 Process 对象上调用

waitFor()
并检查
exitValue()
以查看命令是否成功。如果操作失败,
getInputStream()
将让您阅读写入标准输出的任何错误消息。


3
投票

以下是使用 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);
}


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 在您的类路径中以进行编译和执行。


0
投票

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.