Руководство разработчика по пакетированию приложений

Создание подписанных пакетов

Процесс создания подписанных пакетов включает в себя несколько этапов. Для него требуется знание новых концепций и терминологии. В этом разделе приводится информация о подписанных пакетах, терминологии, а также сведения об управлении сертификатами. В этом разделе также представлены поэтапные указания по созданию подписанного пакета.

Подписанные пакеты

Подписанный пакет - это стандартный пакет формата потока, который имеет цифровую подпись (цифровую подпись PKCS7 с кодировкой PEM, определение которой приводится ниже). При его установке производит следующая проверка:

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

В технологии создания подписанных пакетов используются новые приемы и терминология, которые описаны в приведённой ниже таблице.

Термин 

Определение 

ASN.1 

Абстрактная синтаксическая нотация версии 1 - Способ выражения абстрактных объектов. Например, ASN.1 определяет сертификат открытого ключа, все объекты, составляющие сертификат и порядок, в котором эти объекты установлены. Однако ASN.1 не указывает, каким образом эти объекты сериализуются для хранения или передачи.

X.509 

ITU-T Рекомендация X.509 - Описывает распространенный синтаксис сертификата ключа X.509.

DER 

Правила различенной кодировки - Двоичное представление объекта ASN.1. Определяет, каким образом объект ASN.1 сериализуется для хранения или передачи в вычислительной среде. 

PEM 

Сообщение о улучшенной защите - Способ кодирования файла (в DER или другом двоичном формате) с помощью кодировки Base64 и некоторых дополнительных заголовков. PEM обычно использовался для кодирования электронных сообщений типа MIME. PEM также широко используется для кодирования сертификатов и открытых ключей в файле, существующем в файловой системе или в сообщении электронной почты.

PKCS7 

Стандарт шифрования с открытым ключом #7 - В этом стандарте описываются общие требования к синтаксису данных, которые могут быть зашифрованы, например цифровые подписи и цифровые конверты. Подписанный пакет содержит встроенную подпись PKCS7. В этой подписи в минимальных объемах содержатся сводные данные по пакету, а также данные сертификата открытого ключа в формате X.509 того, кто его подписал. В подписанном пакете могут также содержаться цепочки сертификатов. Цепочки сертификатов могут использоваться при создании цепочки доверия от сертификата лица, подписавшего пакет, до локально хранимых доверенных сертификатов. 

PKCS12 

Стандарт шифрования с открытым ключом #12 - В этом стандарте содержатся требования к синтаксису для хранения зашифрованных объектов на диске. В этом формате поддерживается хранилище ключей. 

Хранилище ключей пакета 

Хранилище сертификатов и ключей, к которым можно обращаться с помощью средств для работы с пакетами. 

Управление сертификатом

Перед созданием подписанного пакета необходимо создать хранилище ключей пакета. Сертификаты в этом хранилище ключей сертификата хранятся в виде объектов. В хранилище ключей пакета есть два типа объектов:

Доверенный сертификат

Доверенный сертификат, содержащий один сертификат открытого ключа, принадлежащий другой организации. Доверенный сертификат называется таковым, поскольку владелец хранилища ключей считает, что открытый ключ в сертификате принадлежит организации (лицу), указанному в поле “тема” (владелец) сертификата. Издатель сертификата делает его доверенным, подписывая сертификат.

При проверке подписей и подключении к защищенному серверу (по протоколу 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. Импорт подписанного сертификата, сертификатов центров сертификации и секретного ключа в хранилище ключей пакета.

  3. Подписывание пакета из Действия 1 с помощью сертификата из Действия 2.


Примечание –

Средства пакетирования не создают сертификаты. Эти сертификаты необходимо получать от центра сертификации, например Verisign или Thawte.


Все действия по созданию подписанных пакетов описаны в следующих процедурах.

ProcedureСоздание неподписанного пакета в формате каталога

Процедура создания неподписанных пакетов в формате каталогов та же, что и при создании стандартного пакета, как описано в этом руководстве ранее. Ниже приводится процедура создания неподписанного пакета в формате каталога. Если необходима дополнительная информация, см. предыдущие разделы, посвященные сборке пакетов.

  1. Создание файла pkginfo.

    Базовое содержимое файла pkginfo должно быть следующим:


    PKG=SUNWfoo
    BASEDIR=/
    NAME=My Test Package
    ARCH=sparc
    VERSION=1.0.0
    CATEGORY=application
  2. Создание файла prototype.

    Базовое содержимое файла 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
  3. Укажите список содержимого исходного каталога объектов.

    Пример:


    $ 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
  4. Создайте неподписанный пакет.


    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.

    В текущем каталоге теперь размещен пакет.

ProcedureИмпорт сертификатов в хранилище ключей пакета

Сертификат и секретный ключ для импорта должны быть представлены в виде сертификата X.509 в кодировке PEM или DER и секретного ключа. Кроме того, перед подписыванием пакета необходимо выполнить импорт всех промежуточных сертификатов или их цепочек, связывающих подписанные сертификаты с центром сертификации.


Примечание –

Каждый центр сертификации может издавать сертификаты в различных форматах. Чтобы извлечь сертификаты и секретные ключи из файла PKCS12 и вставить в файл X.509, зашифрованный с помощью алгоритма PEM (который можно импортировать в хранилище ключей пакета), воспользуйтесь таким бесплатным средством преобразования, как OpenSSL.


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

В следующей процедуре описывается способ импорта сертификата с помощью команды pkgadm после того, как сертификат будет в нужном формате.

  1. Выполните импорт всех сертификатов центра сертификации, которые находятся в файле сертификата 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>
  2. Убедитесь, что сертификат импортирован в хранилище ключей пакета.

    Например, чтобы просмотреть сертификаты в хранилище ключей, созданном в ходе предыдущего действия, введите следующее:


    $ pkgadm listcert -k ~/mykeystore
    

ProcedureПодписывание пакета

После того, как сертификаты импортированы в хранилище пакета, можно подписать пакет. Фактически подписание пакета производится с помощью команды pkgtrans.

  1. Подпишите пакет с помощь команды 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-адрес.