Проверить и подписать банку программно

Я новичок в этой теме, поэтому надеюсь, что использую правильный словарный запас. Можно ли получить возможность Jarsigner внутри Java?

Мне нужна возможность программно делать следующие вещи:

  • проверить, подписан ли 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)

Подписание jar должно работать аналогичным образом:

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

Я знаю, что это дубликат многих других вопросов, но я не доволен их ответами. Решением этих ответов является в большинстве случаев самописный класс, модификация класса, найденного из OpenJDK или подсказка, что код нужно еще написать и как это можно сделать. Для меня это неприемлемо, потому что они не поддерживаются (или я должен сам писать и поддерживать классы), я ничего не знаю об их корректности (особенно если мне придется писать код самому) и проблемах с лицензией.

Чего я не понимаю, так это того, что Oracle не предлагает простого решения, тем более, что это такая важная тема, где ошибка может привести к небезопасной системе.


person gillesB    schedule 10.02.2014    source источник
comment
Ваши возражения против других ответов не складываются. Ваш собственный код также должен поддерживаться.   -  person user207421    schedule 11.02.2014
comment
Да, конечно. Но это имеет значение, если мне нужно поддерживать свои собственные JarSigner и JarVerifier, как в других ответах. Или, если мне нужно только поддерживать код, который использует JarSigner и JarVerifier, предоставленные Oracle, Apache и т. д.   -  person gillesB    schedule 11.02.2014
comment
@EJP: мой текст был недостаточно четким. Надеюсь, теперь я сделал это немного яснее. Итог: я не хочу сам писать такие классы, потому что мне сложно (мне) доказать их правильность.   -  person gillesB    schedule 11.02.2014
comment
Почему бы не использовать прилагаемые (с JRE) утилиты? Избегайте писать это в коде вообще.   -  person Brian Knoblauch    schedule 11.02.2014
comment
@BrianKnoblauch: Вы имеете в виду инструмент командной строки jarsigner? Мне нужен автоматизированный способ выполнения трех пунктов (проверка, отмена подписи, подпись) выше. Я также рассматривал вызов jarsigner с помощью Runtime.getRuntime().exec(), но я думаю, что это довольно неэлегантно.   -  person gillesB    schedule 11.02.2014
comment
Я думаю, что написание ненужного кода гораздо менее элегантно, чем использование готовых утилит. :-) Вызовы во время выполнения не красивы, но позволяют избежать ненужного дублирования функций.   -  person Brian Knoblauch    schedule 11.02.2014


Ответы (1)


Я пытаюсь ответить на вопрос сам.

Подтверждение

Для проверки Jar, похоже, нет хорошего готового решения. Поэтому собственный код должен быть написан.

Подписание

Существует задача Ant SignJar, которая может подписывать банки и использовать задачи Ant внутри Java

Класс для подписи банок может выглядеть так:

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();
}
}

отмена подписи

Пока не нуждался.

person gillesB    schedule 04.03.2014