Подписание приложения для Java-приложений

Я сделал настольное приложение Java с помощью Swing (myProg.jar). В настоящее время я загружаю свое приложение как .app для своих пользователей Mac, и я использую InnoSetup для создания файла setup.exe для моих пользователей Windows. Я также предоставляю оболочку myProg.exe для запуска myProg.jar.

Теперь, чтобы избавиться от SmartScreen и других защит от моих компьютеров пользователей, я думаю, что мне нужно подписать мое приложение. Но чем больше я читал об этом, тем более запутанным мне кажется.

Может ли кто-нибудь уточнить некоторые из следующих моментов для меня?

1) Какой сертификат мне нужен? Есть ли способ сделать его бесплатным или, по крайней мере, дешевым?

2) Что мне нужно, чтобы точно подписать? Должен ли я подписать файл myProg.jar, файл .app? Файл setup.exe? Оболочка myProg.exe? Все они?

3) Решено - Как это работает, когда я обновлю свою программу и заменим myProg.jar новой версией myProg.jar?

Спасибо большое!

Ответ 1

Ваш JDK должен включать инструмент под названием jarsigner. Этот инструмент позволяет вам бесплатно подписывать файлы jar.

1) Ключ, который вы используете для подписи, должен находиться в java keystore (по умолчанию .keystore). Вы можете импортировать ключи в хранилище ключей из .der.

2) Вы можете только подписывать .jar файлы

3) Он просто перезапишет старый файл новым подписанным. Так же, как простая копия. Проверка подписи не будет выполнена, если ваш установщик не сделает этого.

Кроме того, не всякая подпись одинакова. Если вы, например, пытаетесь зарегистрировать поставщика криптозащиты, то подпись, подписанная Oracle, будет необходима для ее запуска в Oracle JVM. видеть: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider.html#Step6

Пример:

Чтобы сгенерировать ключ:

keytool -genkey -keyalg RSA -alias key_alias -keystore mystore.keystore -keysize 2048

Чтобы подписать банку:

jarsigner -keystore mystore.keystore -tsa http://tsa.safecreative.org MyJARFile.jar key_alias_from_keystore

Чтобы проверить подпись:

jarsigner -verify jar-file

Я не уверен, что это решит нашу проблему. В целом, что вам нужно сделать, это знак os executable. В этом случае .exe и .app

Возможное решение - подписать исполняемый файл вашей оболочки приложения (в случае Windows .exe). Для этого см.: https://msdn.microsoft.com/en-us/library/aa387764.aspx

В вашей системе на основе Unix я бы попытался запустить инструмент Mono sign. см. mono doc в "signcode" (я не могу предоставить ссылку, недостаточно rep)

Это должно избавиться от сообщения "Неизвестный издатель", но если вы не можете заставить разработчика ОС подписывать сертификат, пользователю будет показано какое-то сообщение.