Как вы программно подписываете файлы jar на Java?

#java #jar #sign

#java #jar #подписать

Вопрос:

Кто-нибудь делал это раньше? Единственная ссылка, которую я нашел в Google, была: 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

Комментарии:

1. вы могли бы просто вызвать процесс подписи jar из java. лучше всего использовать ProcessBuilder.

Ответ №1:

Для устранения внезапного изменения ограничений безопасности в приложениях WebStart в Java 7u45 мы создали простой генератор подписанных файлов jar. Он использует Guava 15 и модуль bcpkix Bouncy Castle. Он должен работать на Java 6 и 7. Он подходит только для небольших файлов. Используйте его для любых целей, которые вы хотите.

Ответ №2:

Имейте в виду, что sun.security.tools.JarSigner класс был написан для использования в качестве утилиты командной строки и не был предназначен для вызова из кода Java. В результате обработка ошибок происходит довольно быстро: код просто выводит сообщение об ошибке в standard out, а затем вызывает System.exit() 1 .

Это означает, что если вы вызываете класс из своего Java-кода и при попытке подписать jar возникает ошибка, JVM, выполняющая ваш код, просто остановится. Это может быть хорошо в зависимости от вашей ситуации, но если ваш код долго выполняется или действует как сервис, это не так хорошо.

Поэтому лучше вызвать инструмент jarsigner с помощью ProcessBuilder в соответствии с комментарием clamp. Затем вы можете вызвать waitFor() результирующий объект Process и проверить exitValue() , была ли команда выполнена успешно. getInputStream() позволит вам прочитать любые сообщения об ошибках, которые были записаны в standard out, если операция завершится неудачно.

Ответ №3:

В инструментах.файл jar — это класс sun.security.tools.JarSigner, который имеет статический запуск (ava.lang.String[] strings) метод, который принимает те же параметры, что и исполняемый файл jarsigner.

Итак, вы можете вызвать что-то вроде:

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

Вам нужно убедиться, что инструменты.jar находится в вашем пути к классу для компиляции и выполнения.

Ответ №4:

Вот как это сделать с помощью 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);
}

  

Ответ №5:

Я использую задачу SingJar Ant (которая, по-видимому, вызывает инструмент командной строки внизу). Это должно быть возможно вызвать программно.

Комментарии:

1. @wuntee: Я подозреваю, что Ant taks сделал бы это, если бы это было легко возможно.