以编程方式验证和签署 Jar

gil*_*esB 5 java signing jar jarsigner

我是这个话题的新手,因此我希望我使用正确的词汇。是否有可能在 Java self 中获得 Jarsigner 的可能性?

我需要有可能以编程方式执行以下操作:

  • 验证 jar 是否使用密钥库中的某个私钥签名
  • 如果罐子被验证:取消罐子的签名
  • 使用来自官方证书颁发机构的另一个私钥对 jar 进行签名,该私钥位于同一个或另一个密钥库中

在伪代码中,我想象的是这样的:

JarVerifier verifier = new JarVerifier(/*all needed parameters like the location of the keystore*/);
verifier.verify(jarFile); //returns a value which indicates the result (an Enum or an integer value)
Run Code Online (Sandbox Code Playgroud)

签署 jar 应该以类似的方式工作:

JarSigner signer = new JarSigner(/*all needed parameters like the location of the keystore, passwords, alias*/);
signer.sign(jarFile);
Run Code Online (Sandbox Code Playgroud)

我知道这是许多其他问题的重复,但我对他们的回答不满意。在大多数情况下,这些答案的解决方案是自写类、对从 OpenJDK 找到的类的修改或提示仍需要编写代码以及如何完成。这对我来说是不可接受的,因为它们没有得到维护(或者我必须自己编写和维护类),我对它们的正确性(特别是如果我必须自己编写代码)和许可证问题一无所知。

我不明白的是,Oracle 似乎没有提供简单的解决方案,尤其是因为它是一个如此关键的主题,错误可能会导致系统不安全。

gil*_*esB 1

我尝试自己回答这个问题。

正在验证

为了验证 Jar,似乎没有一个好的即用型解决方案。因此需要编写自己的代码。

签约

Ant Task SignJar能够对 jar 进行签名,并且可以在 Java 中使用 Ant Tasks

对 jar 进行签名的类可以如下所示:

public class JarSigner extends SignJar {

public JarSigner() {
    project = new Project();
    project.init();
    taskType = "signJar";
    taskName = "signJar";
    target = new Target();
}

public static void signJar(File jarToSign, String alias, String keypass, String keystore, String storepass) {
    JarSigner signer = new JarSigner();
    signer.setJar(jarToSign);
    signer.setAlias(alias);
    signer.setKeypass(keypass);
    signer.setKeystore(keystore);
    signer.setStorepass(storepass);
    signer.setSignedjar(jarToSign);
    signer.execute();
}
}
Run Code Online (Sandbox Code Playgroud)

取消签名

还不需要它。