Зачем нужны JAR-архивы?
Использование JAR-архивов предоставляет разработчикам аплетов (а также и автономных приложений) ряд преимуществ.
- Повышение эффективности загрузки. Вместо нескольких файлов отдельных классов загружается единственный файл JAR-архива.
- Улучшенное хранилище файлов, так как файлы классов хранятся в одном сжатом файле архива.
- Повышение защищённости. В JAR-файл можно поместить цифровую подпись, дающею конечному пользователю гарантии, что файл архива не изменился с момента её внесения. Если конечный пользователь доверяет вашей фирме, он может предоставить подписанным вами аплетам право доступа к его жестким дискам или другим важным ресурсам системы.
- Независимость от платформы. Построение JAR-архивов базируется на использовании популярной программы PKZIP сжатия файлов. Однако JAR-файлы могут создаваться и сохраняться на любой компьютерной платформе.
- Расширяемость. В спецификацию JAR-файлов внесены некоторые дополнения, обеспечивающие возможность дальнейших расширений.
Одно только повышение эффективности загрузки даёт какое преимущество! Если вы знакомы с работой протокола HTTP, то должны понимать насколько неэффективно, с его помощью, выполнять передачу нескольких небольших файлов. В каждом случае потребуется установить новое соединение TCP/IP, которое после передачи данного файла будет разорвано. Установка каждого соединения связана с дополнительной нагрузкой на сервер и сеть. При использовании коммутируемых линий связи среднее время установки TCP/IP-соединения может составлять около 0,5 c. Если для работы аплета необходимо 16 файлов, общее время затрачиваемое только на установку соединений - 8 с.
Создание JAR-архива
Для создания и модификации JAR-архивов можно использовать любую поддерживающую формат PKZIP программу. JAR-файл отличается от zip-файла наличием дополнительного текстового файла, называемого файлом описания (manifest file). Этот файл содержит сведения обо всех помещённых в данный архив файлах. В состав файла описания должны входить определённые элементы, в частности он должен включать следующие.
- Номер версии стандарта JAR. В соответствии, с которым построен данный архив. Этот номер задаётся параметром Manifest-Version и является обязательным. В SDK 1.2 значение этого параметра должно быть равно 1.0
- Минимальный номер версии утилиты JAR, которая сможет прочитать этот архив. Этот параметр необязателен и имеет название Required-Version.
- Отдельная запись для любого, помещённого в архив файла. Необязательно перечислять все помещённые в архив файлы, достаточно указать только файлы главных классов.
Фирма Sun предоставила, для создания JAR архивов, специализированный инструмент для всех поддерживаемых платформ. Рассмотрим создание JAR-архива с помощью этой утилиты под названием jar.
Предположим, что у нас имеется каталог, содержащий несколько файлов типа .class и подкаталог с именем images содержащий несколько файлов типа .gif. Пусть имя создаваемого архива будет archive.jar
Общий формат команды вызова утилиты jar: jar параметры имена_файлов
Параметр имена_файлов представляет собой список имён файлов, первым в котором всегда указывается имя самого архивного файла. Назначение остальных имён файлов зависит от ключей:
- c
- - создать новый архив.
- m
- - использовать внешний файл описания, имя которого указано вторым в списке имена_файлов.
- M
- - не создавать файл описания.
- t
- - вывести содержание указанного архивного.
- x
- - извлечь файлы, указанные в списке имена_файлов. Если имена не указаны, то извлечь все файлы.
- f
- - указывает, что имя архивного файла помещено первым в списке имена_файлов.
- v
- - указывает, что утилита должна сопровождать сообщениями выполнение всех действий, заданных другими параметрами.
- 0
- - сохранение файлов в архиве выполняется без их сжатия.
- u
- - указывает, что нужно обновить указанные файлы. Или в случае команды jar umf manifest имя_архива указывает что нужно обновить информацию в файле описания.
- -i
- - указывает, что необходимо сгенерировать файл INDEX.LIST содержащий информацию о всех файлах архива.
И так для создания нового архива введите:
jar cf archive.jar .class images/.gif
Помещение в JAR-архив цифровой подписи
Для того чтобы разобраться, как цифровая подпись помещается в JAR-архив, необходимо предварительно усвоить определённые базовые понятия из области криптографии - шифрование с помощью открытого ключа.
Для внесения цифровой подписи в JAR-архив необходимо иметь два инструмента.
- Утилита keytool. Используется для генерации пары открытого и закрытого ключа и сертификата.
- Утилита jarsigner. Используется для непосредственного помещения цифровой подписи в JAR-архивы с применением имеющегося сертификата.
Что нам понадобится:
- Выполнить генерацию пары ключей.
- Получить сертификат на эту пару.
- Использовать сертификат для помещения цифровой подписи в JAR-архив.
Генерация пары ключей
Для генерации новой пары ключей можно использовать следующею команду:
keytool -genkey -alias testkey
В результате выполнения этой команды будет создана новая пара ключей сохранённая в базе данных под именем testkey. Вот что у нас получится:
Программа keytool позволяет указывать следующие параметры:
- -v
- - запрос вывода сообщений о действии программы.
- -alias псевдоним
- - псевдоним (имя) который присваивается этой паре.
- -keyalg алгоритм_ключа
- - алгоритм шифрования вашей подписи - обычно по умолчанию это алгоритм SHA1 with DSA и его можно не указывать если не собираетесь изменять его, размер ключа при генерации DSA ключевой пары может быть от 512 до 1024 бит, но если вы хотите применить MD5 with RSA то укажите опцию -keyalg "RSA" Следует заметить что опция -keyalg обуславливает и опцию -sigalg - алгоритм подписи который будет использован по умолчанию для подписания jar-файла (при создании дайджестов сообщений).
- -keysize длина_ключа
- - размер генерируемых ключей в битах.
- -keypass пароль
- - пароль для данного ключа. Если пароль не будет указан в командной строке, программа предложит ввести его значение в режиме диалога. Длина пароля должна быть не менее шести символов.
- -keystore хранилище
- - расположение хранилища ключей.
- -storepass пароль
- - пароль доступа к хранилищу ключей.
- -validity valDays
- - срок годности вашего сертификата. По умолчанию это 180 дней, можно указать больше или меньше.
По умолчанию утилита keytool помещает открытый ключ в подписанный вами же сертификат X.509.v1.
Командой keytool -list мы можем посмотреть содержимое keystore:
Получение сертификата
После генерации новой пары ключей необходимо выполнить генерацию запроса CSR(Certificate Signing Request). Этот запрос отсылается в любую выбранную службу сертификации.
Для генерации CSR запроса введите следующею команду:
keytool -certreq
Для нашей пары ключей testkey команда будет выглядеть следующим образом:
keytool -certreq -alias testkey
При генерации CSR запроса допускаются следующие параметры:
- -v
- - сопровождение работы программы выдачей сообщений.
- -alias псевдоним
- - определение псевдонима пары ключей, для которых необходимо получить сертификат. По умолчанию применяется значение mekey.
- -sigalg алгоритм_сигнатуры
- - задание используемого алгоритма внесения подписи.
- -file csr_файл
- - имя и расположение файла, в котором помещается генерируемый запрос.
- -keypass пароль
- - пароль для доступа к данному ключу.
- -storepass пароль
- - пароль доступа к хранилищу ключей.
- -keystore хранилище
- - имя и расположения файла с парой ключей.
Сгенерированный CSR-запрос отсылается в выбранную службу сертификации. После проведения всех необходимых проверок и удостоверения вашей личности вам будет выдан требуемый сертификат.
keytool -import
Следующие параметры могут быть указаны в режиме import:
- -v
- - сопровождение работы программы выдачей сообщений.
- -alias псевдоним
- - псевдоним полного имени, которое будет использоваться с данным сертификатом.
- -file файл-сертификата
- - имя и расположение файла, в котором сохранён полученный сертификат.
Команда:
keytool -export -alias testkey -file имя_файла
даст указание утилите скопировать ваш сертификат в указанный файл. Отправьте свой сертификат всем получателям, которые будут использовать подписанные вами JAR-архива.
Помещение в JAR-архив цифровой подписи с помощью утилиты jarsigner
Помимо помещения цифровой подписи в JAR-архивы утилита jarsigner способна также проверять целостность подписанных JAR-архивов. Для этого достаточно запустить её с параметром -verify/
При вводе команды:
jarsigner myJarFile.jar
тилита воспользуется хранилищем ключей по умолчанию и результат будет помещён в файл myJarFile.jar, который заместит исходный файл архива.
Для создания JAR-архива подписанного нашими ключами testkey введите следующею команду:
jarsigner myJarFile.jar testkey
Для того чтобы файл myJarFile.jar остался неизменённым а результат записался, например, в файл mySignedJarFile.jar введите команду:
jarsigner -signedjar mySignedJarFile.jar myJarFile.jar testkey.