Процесс создания подписанных пакетов включает в себя несколько этапов. Для него требуется знание новых концепций и терминологии. В этом разделе приводится информация о подписанных пакетах, терминологии, а также сведения об управлении сертификатами. В этом разделе также представлены поэтапные указания по созданию подписанного пакета.
Подписанный пакет - это стандартный пакет формата потока, который имеет цифровую подпись (цифровую подпись PKCS7 с кодировкой PEM, определение которой приводится ниже). При его установке производит следующая проверка:
Пакет получен от того, кем он был подписан
Факт подписывания пакета этим лицом
Пакет не изменялся с того момента, когда он был подписан
Лицо или компания, подписавшая пакет, является доверенным (-ой)
Подписанный пакет идентичен неподписанному, за исключением наличия подписи. Подписанный пакет имеет двоичную совместимость с неподписанным пакетом. Поэтому подписанный пакет может использоваться совместно со старыми версиями средств для работы с пакетами. Тем не менее, в этом случае подпись игнорируется.
В технологии создания подписанных пакетов используются новые приемы и терминология, которые описаны в приведённой ниже таблице.
Перед созданием подписанного пакета необходимо создать хранилище ключей пакета. Сертификаты в этом хранилище ключей сертификата хранятся в виде объектов. В хранилище ключей пакета есть два типа объектов:
Доверенный сертификат, содержащий один сертификат открытого ключа, принадлежащий другой организации. Доверенный сертификат называется таковым, поскольку владелец хранилища ключей считает, что открытый ключ в сертификате принадлежит организации (лицу), указанному в поле “тема” (владелец) сертификата. Издатель сертификата делает его доверенным, подписывая сертификат.
При проверке подписей и подключении к защищенному серверу (по протоколу SSL) используются доверенные сертификаты.
Пользовательский ключ, содержащий секретную информацию ключа шифрования. Эта информация хранится в защищенном формате для предотвращения несанкционированного использования. Пользовательский ключ состоит из секретного ключа пользователя и соответствующего ему сертификата открытого ключа.
Пользовательские ключи используются при создании подписанного пакета.
По умолчанию хранилище ключей расположено в каталоге /var/sadm/security. Отдельные пользователи могут также иметь собственные хранилища ключей, которые по умолчанию располагаются в каталоге $HOME/.pkg/security.
На диске хранилище ключей может иметь два формата: формат одного файла и формат нескольких файлов. При использовании формата нескольких файлов объекты хранятся в нескольких файлах. Каждый тип объекта хранится в отдельном файле. Все эти файлы должны быть зашифрованы с помощью одного пароля. При использовании хранилища в формате одного файла все объекты хранятся в одном файле файловой системы.
Основным средством для управления сертификатами и хранилищем ключей пакета является команда pkgadm. Более распространенные задачи, которые используются при управлении хранилищем ключей пакета, представлены в подразделах ниже.
Доверенный сертификат можно добавить в хранилище пакета с помощью команды pkgadm. Сертификат может иметь формат PEM или DER. Пример:
$ pkgadm addcert -t /tmp/mytrustedcert.pem |
В этом примере сертификат в формате PEM имеет имя mytrustedcert.pem и добавлен в хранилище ключей пакета.
С помощью команды pkgadm невозможно создание пользовательских сертификатов или секретных ключей. Пользовательские сертификаты и секретные ключи обычно можно получить от центра сертификации, например Verisign. Их также можно создать локально в виде самоподписанных сертификатов. После получения ключа и сертификата их можно импортировать в хранилище ключей пакета с помощью команды pkgadm. Пример:
pkgadm addcert -n myname -e /tmp/myprivkey.pem /tmp/mypubcert.pem |
В этом примере используются следующие параметры:
-n myname |
Указывает организацию или лицо (myname) в хранилище данных пакета, над которым необходимо выполнять действие. Организация myname становится псевдонимом, под которым хранятся объекты. |
-e /tmp/myprivkey.pem |
Указывает файл, содержащий секретный ключ. В этом случае этот файл - myprivkey.pem, который расположен в каталоге /tmp. |
/tmp/mypubcert.pem |
Указывает сертификат формата PEM, который имеет имя mypubcert.pem . |
Команда pkgadm также используется для просмотра содержимого хранилища ключей пакета. Пример:
$ pkgadm listcert |
С помощью этой команды производится отображение доверенных сертификатов и секретных ключей, которые находятся в хранилище ключей пакета.
Чтобы удалить доверенные сертификаты и закрытые ключи из хранилища ключей пакета, можно использовать команду pkgadm.
При удалении пользовательских сертификатов необходимо указывать псевдоним пары сертификат/ключ. Пример:
$ pkgadm removecert -n myname |
Псевдоним сертификата - это его общее имя, которое может быть указано с помощью команды pkgadm listcert. Например, с помощью этой команды производится удаление доверенного сертификата с именем Trusted CA Cert 1:
$ pkgadm removecert -n "Trusted CA Cert 1" |
Если под одним псевдонимом хранятся доверенный сертификат и пользовательский сертификат, при использовании параметра -n оба они удаляются.
Процесс создания подписанного пакета включает в себя три основных этапа:
Создание неподписанного пакета в формате каталога.
Импорт подписанного сертификата, сертификатов центров сертификации и секретного ключа в хранилище ключей пакета.
Подписывание пакета из Действия 1 с помощью сертификата из Действия 2.
Средства пакетирования не создают сертификаты. Эти сертификаты необходимо получать от центра сертификации, например Verisign или Thawte.
Все действия по созданию подписанных пакетов описаны в следующих процедурах.
Процедура создания неподписанных пакетов в формате каталогов та же, что и при создании стандартного пакета, как описано в этом руководстве ранее. Ниже приводится процедура создания неподписанного пакета в формате каталога. Если необходима дополнительная информация, см. предыдущие разделы, посвященные сборке пакетов.
Базовое содержимое файла pkginfo должно быть следующим:
PKG=SUNWfoo BASEDIR=/ NAME=My Test Package ARCH=sparc VERSION=1.0.0 CATEGORY=application |
Базовое содержимое файла prototye должно быть следующим:
$cat prototype i pkginfo d none usr 0755 root sys d none usr/bin 0755 root bin f none usr/bin/myapp=/tmp/myroot/usr/bin/myapp 0644 root bin |
Укажите список содержимого исходного каталога объектов.
Пример:
$ ls -lR /tmp/myroot |
В результате должно получиться следующее:
/tmp/myroot: total 16 drwxr-xr-x 3 abc other 177 Jun 2 16:19 usr /tmp/myroot/usr: total 16 drwxr-xr-x 2 abc other 179 Jun 2 16:19 bin /tmp/myroot/usr/bin: total 16 -rw------- 1 abc other 1024 Jun 2 16:19 myapp |
Создайте неподписанный пакет.
pkgmk -d `pwd` |
В результате должно получиться следующее:
## Building pkgmap from package prototype file. ## Processing pkginfo file. WARNING: parameter <PSTAMP> set to "syrinx20030605115507" WARNING: parameter <CLASSES> set to "none" ## Attempting to volumize 3 entries in pkgmap. part 1 -- 84 blocks, 7 entries ## Packaging one part. /tmp/SUNWfoo/pkgmap /tmp/SUNWfoo/pkginfo /tmp/SUNWfoo/reloc/usr/bin/myapp ## Validating control scripts. ## Packaging complete. |
В текущем каталоге теперь размещен пакет.
Сертификат и секретный ключ для импорта должны быть представлены в виде сертификата X.509 в кодировке PEM или DER и секретного ключа. Кроме того, перед подписыванием пакета необходимо выполнить импорт всех промежуточных сертификатов или их цепочек, связывающих подписанные сертификаты с центром сертификации.
Каждый центр сертификации может издавать сертификаты в различных форматах. Чтобы извлечь сертификаты и секретные ключи из файла PKCS12 и вставить в файл X.509, зашифрованный с помощью алгоритма PEM (который можно импортировать в хранилище ключей пакета), воспользуйтесь таким бесплатным средством преобразования, как OpenSSL.
Если секретный ключ зашифрован (как обычно и должно быть), выдается запрос на ввод пароля. Кроме того, выдается запрос на ввод пароля для защиты хранилища ключей пакета, которое будет получено в результате. Пароль можно не указывать, однако при этом хранилище ключей пакета зашифровано не будет.
В следующей процедуре описывается способ импорта сертификата с помощью команды pkgadm после того, как сертификат будет в нужном формате.
Выполните импорт всех сертификатов центра сертификации, которые находятся в файле сертификата X.509 с кодировкой PEM или DER.
Например, для импорта всех сертификатов центра сертификации, которые находятся в файле ca.pem, необходимо ввести следующую команду:
$ pkgadm addcert -k ~/mykeystore -ty ca.pem |
В результате должно получиться следующее:
Trusting certificate <VeriSign Class 1 CA Individual \ Subscriber-Persona Not Validated> Trusting certificate </C=US/O=VeriSign, Inc./OU=Class 1 Public \ Primary Certification Authority Type a Keystore protection Password. Press ENTER for no protection password (not recommended): For Verification: Type a Keystore protection Password. Press ENTER for no protection password (not recommended): Certificate(s) from <ca.pem> are now trusted |
Чтобы импортировать ключ подписи в хранилище ключей пакета, необходимо указать псевдоним, который будет использоваться позднее при подписании пакета. Этот псевдоним также можно использовать в случае, если необходимо удалить ключ из хранилища ключей пакета.
Например, чтобы импортировать ключ подписи из файла sign.pem, необходимо ввести следующее:
$ pkgadm addcert -k ~/mykeystore -n mycert sign.pem |
В результате должно получиться следующее:
Enter PEM passphrase: Enter Keystore Password: Successfully added Certificate <sign.pem> with alias <mycert> |
Убедитесь, что сертификат импортирован в хранилище ключей пакета.
Например, чтобы просмотреть сертификаты в хранилище ключей, созданном в ходе предыдущего действия, введите следующее:
$ pkgadm listcert -k ~/mykeystore |
После того, как сертификаты импортированы в хранилище пакета, можно подписать пакет. Фактически подписание пакета производится с помощью команды pkgtrans.
Подпишите пакет с помощь команды pkgtrans. Укажите расположение подписанного пакета, а также псевдоним ключа для подписания.
Например, используя примеры процедур выше, для создания подписанного пакета с именем SUNWfoo.signed необходимо ввести следующее:
$ pkgtrans -g -k ~/mykeystore -n mycert . ./SUNWfoo.signed SUNWfoo |
В результате выполнения этой команды получится следующее:
Retrieving signing certificates from keystore </home/user/mykeystore> Enter keystore password: Generating digital signature for signer <Test User> Transferring <SUNWfoot> package instance |
Подписанный пакет создан в файле SUNWfoo.signed. Пакет имеет формат потока пакета. Подписанный пакет можно скопировать на веб-сайт и установить с помощью команды pkgadd, указав URL-адрес.