Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式验证并签署Jar_Java_Jar_Signing_Jarsigner - Fatal编程技术网

Java 以编程方式验证并签署Jar

Java 以编程方式验证并签署Jar,java,jar,signing,jarsigner,Java,Jar,Signing,Jarsigner,我不熟悉这个话题,因此我希望我能使用正确的词汇。 有可能在Java self中获得Jarsigner的可能性吗 我需要以编程方式完成以下工作: 验证是否使用密钥库中的特定私钥对jar进行了签名 如果jar已验证:取消jar的签名 使用来自官方证书颁发机构的另一个私钥对jar进行签名,该私钥位于同一密钥库或另一密钥库中 在伪代码中,我想象如下: JarVerifier verifier = new JarVerifier(/*all needed parameters like the loc

我不熟悉这个话题,因此我希望我能使用正确的词汇。 有可能在Java self中获得Jarsigner的可能性吗

我需要以编程方式完成以下工作:

  • 验证是否使用密钥库中的特定私钥对jar进行了签名
  • 如果jar已验证:取消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)
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();
}
}
签署jar应该以类似的方式工作:

JarSigner signer = new JarSigner(/*all needed parameters like the location of the keystore, passwords, alias*/);
signer.sign(jarFile);
我知道这是许多其他问题的重复,但我对他们的答案不满意。在大多数情况下,这些答案的解决方案是一个自行编写的类、对OpenJDK中的类的修改,或者提示代码仍需编写,以及如何编写。 这对我来说是不可接受的,因为它们没有维护(或者我必须自己编写和维护这些类),我对它们的正确性(特别是如果我必须自己编写代码)和许可证问题一无所知


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

我试图自己回答这个问题

验证

要验证Jar,似乎没有一个好的现成的解决方案。因此,需要编写自己的代码

签名

Ant任务能够对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)
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();
}
}
取消签名


我还不需要它。

你对其他答案的反对意见是站不住脚的。您自己的代码也必须维护。是的,当然。但是,如果我必须像其他答案一样维护自己的JarSigner和JarVerifier,这会有所不同。或者如果我只需要维护使用Oracle、Apache等提供的JarSigner和JarVerifier的代码,@EJP:我的文本不够清晰。我希望我现在说得更清楚一点。一句话:我不想自己编写此类类,因为(对我来说)很难证明它们的正确性。为什么不使用提供的(JRE)实用程序呢?完全避免用代码编写。我认为编写不必要的代码远不如使用提供的实用程序优雅。:-)运行时调用并不性感,但可以避免不必要的功能重复。