rpmsign-external
Пакет rpmsign-external-tool предоставляет библиотеку и утилиту командной строки rpmsign-external для подписывания установочных пакетов приложений ОС Аврора.
- Подписание пакета
- Подписание нескольких пакетов
- Проверка подписи пакета
- Удаление подписи из пакета
- Ротация ключей
Подписание пакета
Для подписания пакета необходимы:
- Файл ключа {key}.pem. Для создания ключа см. раздел Генерация ключа.
- Файл сертификата {cert}.pem. Для получения сертификата см. раздел Выпуск сертификата.
Чтобы подписать пакет, нужно выполнить следующую команду:
rpmsign-external sign \
--key {key}.pem \
--cert {cert}.pem \
{package_name}.rpm
При выполнении команды потребуется ввести кодовую фразу ключа.
Чтобы избежать необходимости интерактивного ввода (например, при сборке в конвейере CI/CD),
кодовая фраза может быть задана в переменной окружения KEY_PASSPHRASE
:
KEY_PASSPHRASE=12345678 rpmsign-external sign \
--key {key}.pem \
--cert {cert}.pem \
{package_name}.rpm
Иногда может потребоваться заменить существующую подпись новой
(например, если используются отдельные ключи разработки и производства).
Это можно сделать с помощью флага --force
:
rpmsign-external sign \
--force \
--key {key}.pem \
--cert {cert}.pem \
{package_name}.rpm
Если в пакете нет подписей,
--force
будет действовать так же, как обычная команда sign
.
Но когда пакет уже подписан,
все подписи до типа предоставленного сертификата будут удалены.
То есть:
- Если был предоставлен сертификат разработчика, то подписи разработчика и источника будут удалены.
- Если был предоставлен сертификат источника, то будет удалена только подпись источника (подпись разработчика останется нетронутой).
Подписание нескольких пакетов
Для подписания нескольких пакетов одновременно нужно указать пути ко всем из них:
rpmsign-external sign \
--key {key}.pem \
--cert {cert}.pem \
{package_1}.rpm ... {package_N}.rpm
По умолчанию, подписание будет выполняться параллельно с максимальным количеством заданий,
установленным на getconf _NPROCESSORS_ONLN
.
Переопределить это поведение можно с помощью параметра --jobs
, например:
rpmsign-external sign \
--jobs 2 \
--key {key}.pem \
--cert {cert}.pem \
{package_1}.rpm ... {package_N}.rpm
В большинстве случаев нет необходимости переопределять этот параметр, так как значения по умолчанию будут работать нормально.
Нужно иметь в виду, что все другие команды, связанные с пакетами
(delete
, verify
, dump
) также принимают несколько пакетов одновременно,
но только подписание работает параллельно.
Если необходимо подписать большое количество пакетов (например, целый репозиторий), то один из самых простых способов подписать их все — выполнить следующую команду:
find . -name "*.rpm" -exec rpmsign-external sign \
-k {key}.pem \
-c {cert}.pem \
{} +
Проверка подписи пакета
Чтобы проверить подпись пакета, необходимо указать путь к корневому сертификату CA (например, ca.pem):
rpmsign-external verify \
--root-cert ca.pem \
{package_name}.rpm
Просмотр важных атрибутов подписи (имени субъекта, метки и ID ключа):
rpmsign-external dump
{package_name}.rpm
Удаление подписи из пакета
Для удаления последней подписи из пакета следует выполнить команду:
rpmsign-external delete -l {package_name}.rpm
Для удаления всех подписей из пакета:
rpmsign-external delete {package_name}.rpm
Ротация ключей
Ротация ключей даёт разработчикам возможность изменять ключи подписания как часть обновления пакета и устанавливать пакет с тем же именем, но подписанный другим ключом. Для этого в подписи пакета должна присутствовать цепочка подтверждений ротации ключей.
Чтобы иметь возможность ротировать ключи, сначала должна быть сгенерирована цепочка подтверждений ротации. Для этого нужны:
- закрытый ключ старого подписывающего лица old-key.pem;
- старый сертификат подписавшего old-cert.pem;
- закрытый ключ нового подписавшего key.pem;
- сертификат нового подписывающего лица cert.pem.
Чтобы сгенерировать цепочку подтверждения ротации, необходимо выполнить следующую команду:
rpmsign-external rotate \
--old-key old-key.pem \
--old-cert old-cert.pem \
--new-key key.pem \
--new-cert cert.pem \
--out rotation-chain.pem
После создания цепочки подтверждения ротации rotation-chain.pem её можно использовать при подписании пакета:
rpmsign-external sign \
--key key.pem \
--cert cert.pem \
--rotate rotation-chain.pem \
{package_name}.rpm
Не нужно создавать этот файл перед каждым подписанием. Его нужно сгенерировать один раз, а затем использовать везде, где потребуется подписать пакет.
Если все пакеты были обновлены, старый ключ заменён на новый, можно прекратить включать цепочку ротации в подпись. Иногда требуется обеспечить максимальную совместимость, чтобы иметь возможность обновлять даже самую старую версию пакета, например, ротация от key A к key B, а затем к key C — и этого можно достигнуть, добавив предыдущую цепочку подтверждений ротации к новой:
rpmsign-external rotate \
--old-key {key-A}.pem \
--old-cert {cert-A}.pem \
--new-key {key-B}.pem \
--new-cert {cert-B}.pem \
--out {rotation-chain-A-B}.pem
rpmsign-external rotate \
--prepend {rotation-chain-A-B}.pem \
--old-key {key-B}.pem \
--old-cert {cert-B}.pem \
--new-key {key-C}.pem \
--new-cert {key-C}.pem \
--out {rotation-chain-A-B-C}.pem