#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 сделал бы это, если бы это было легко возможно.