Подписывание Java-апплетов
Введение
Java апплеты позволяют делать интерактивный интерфейс и использовать много дополнительной функциональности от Java. Например проигрывание звука, доступ к файловой системе компьютера, загрузка данных извне по любым протоколам, даже с использованием обычного сокета, обрезка изображений, выполнение цифровой подписи и многое другое, и всё это прямо в браузере! Разработчику предоставляется полная мощность языка Java и сторонних Java-библиотек. Вещи, которые можно сделать с помощью апплета, порой недоступны даже очень навороченному JavaScript-фронтенду.При выкладывании апплетов пользователем возникает проблема: JVM отказываются запускать, потому что считает апплет несекьюрным, при этом браузер показывает пользователю множество агрессивных варнингов с пугающими и непонятными сообщениями. Для того чтобы избавится от них, необходимо подписать апплет доверенным сертификатом и настроить необходимые параметры в файле манифеста.
Запуск апплета сводится к запуску браузером jar-файла. Секьюрити механизм JVM начинает загружать jar-ник и проверять его на безопасность перед тем, как будут загружены классы. При этом проверяются настройки уровня безопасности апплетов в самой JVM на клиенте, параметры в манифесте jar-файла, а также проверка цифровой подписи.
Подписывание апплета подразумевает подписывание jar-файла. Выполняется это утилитой jarsigner. Утилита вставляет в jar-ку зашифрованный ключ, содержащий информацию о ресурсах. Если попытаться модифицировать классы подписанной jar-ки, то она не пройдёт проверку на секьюрность и не будет исполнена.
Апплет может быть не подписанным, подписанным самодельным или доверенным сертификатом. Неподписанные апплеты JVM старается не загружать вообще (поведение зависит от версии и настроек). Если подписать апплет самодельным сертификатом, браузер будет отображать сообщения-варнинги, отпугивающие пользователя. Такой ответ годится разве что для девелопмента, но никак не для продакшена.
Как происходит подписывание апплета
Для начала необходимо создать файл-хранилище ключей. Это делается утилитой keytool. В данном примере мы будем делать самодельный сертификат и подпишем им апплет.keytool -genkeypair -keystore mystore -storepass storePassword -alias mykey -keypass keyPassword
Эта команда создаёт кейстор, который содержит ключ для подписи. Далее этим кейстором нужно подписать апплет:
jarsigner applet.jar -keystore mystore -storepass storePassword -keypass keyPassword mykey
Так как мы подписали апплет самодельным сертификатом, в консоли появится сообщение:
Warning:
The signer certificate will expire within six months.
После этого апплет будет запускаться в браузерах с выдачей варнингов о секьюрность. Чтобы их не было, необходимо получить доверенный сертификат и подписать им апплет.
Получение доверенного сертификата и подписывание
Доверенный сертификат необходимо приобрести у соответствующей организации. Стоимость может колебаться от 200$ до 500$ в год. Мы заказывали у godaddy. Для операций с сертификатами используется утилита keytool. Процесс получения сертификата следующий:1) Создаём хранилище keystore.
keytool -genkeypair -alias keyName -keypass keyPassword -keystore keystore -storepass storePassword -keyalg RSA -keysize 2048
2) После генерации keystore внутри него будет находиться недоверенный сертификат. Чтобы сделать его доверенным, нужно сгенерировать файл запроса к авторизированной организации.
keytool -certreq -alias keyName -file request.csr -keypass keyPassword -keystore keystore -storepass storePassword
В результате появится файл request.csr, который нужно отправить авторизированной организации. На сайте организации необходимо создать запрос, загрузить request.csr.
3) После оплаты организация предоставит ссылку на скачивания файла подтверждения, который нужно импортировать обратно в keystore. Файл подтверждения может быть в нескольких форматах, но об этом позже. Импортируется файл с помощью той же утилиты keytool.
keytool -importcert -alias keyName -file resounce.pem -keypass keyPassword -trustcacerts -keystore keystore -storepass storePassword
Апплет нужно подписать полученным кейстором:
jarsigner applet.jar keyName -keystore keystore -storepass storePassword -keypass keyPassword
После запуска подписанного апплета браузер будет выдавать приветливое окошко с сообщением о принадлежности апплета доверенному источнику. Более того если поставить галочку, то сообщение больше никогда не появится.
Какие бывают разновидности сертификатов
Утилита jarsigner принимает только keystore — хранилище сертификатов, в котором должен лежать ключ. Когда мы хотим сделать доверенный сертификат, авторизированная организация может прислать нам ответ в разных форматах.Сертификаты бывают двух основных кодировок:
- DER — бинарный формат;
- PEM — формат ASCII, закодированный в BASE 64.
Файлы сертификатов могут иметь такие расширения:
- .CRT — более характерно для Unit-систем;
- .CER — стандарт от Microsoft;
- .KEY — содержит и приватный и публичный ключ.
Утилита keytool может импортировать только формат PEM. Типы сертификатов можно конвертировать между собой при помощи openssl.
Из pem в der:
openssl x509 -in cert.crt -outform der -out cert.der
Из der в pem:
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
Более подробно можно почитать тут:
- https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them
- https://www.sslshopper.com/article-most-common-openssl-commands.html
Импортирование существующего сертификата в keystore
Утилита jarsigner подписывает jar-файлы только с keystore, который создаётся утилитой keytool. К сожалению, если у вас уже есть существующий сертификат, то импортировать его в keystore может представлять проблему, так как нет стандартных механизмов для этого.Полезные ссылки
Утилиты в составе JDK:- https://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
- https://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html
Статьи по подписыванию Java-апплетов:
- https://docs.oracle.com/javase/tutorial/deployment/jar/signing.html
- https://habr.com/ru/post/204984/
Получение коммерческого сертификата:
Различные форматы сертификатов и их конвертация: