Участник:Petr-akhlamov/Ownrepo plusownkey

Материал из ALT Linux Wiki

Структура

Базовый каталог

Базовый каталог html:

/var/www/html/

Создаем каталог для репозитория:

# mkdir -p /var/www/html/extra

Создаем каталог branch:

# mkdir -p /var/www/html/extra/branch/p11/
# chown apache:apache -R /var/www/html
# systemctl restart httpd2.service

Корневой каталог Apache2

Отредактируйте файл:

# mcedit /etc/httpd2/conf/httpd2.conf

Исправьте корневой каталог:

DocumentRoot /var/www/html

Конфигурационный файл сайта

Создайте файл, в котором, кроме прочего, будут описаны:

  • каталог сайта на диске
  • разрешение на отображение его содержимого по http
  • разрешение на открытый доступ по http
mcedit /etc/httpd2/conf/sites-available/apt-repo.conf
<VirtualHost *:80>
    ServerName your-server-domain
    DocumentRoot /var/www/html/extra
    
    <Directory /var/www/html/extra>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        IndexOptions FancyIndexing NameWidth=*
    </Directory>
    
    # Включение листинга каталогов
    IndexOptions FancyIndexing NameWidth=* DescriptionWidth=*
</VirtualHost>

Включаем конфиг:

# a2ensite apt-repo
# systemctl restart httpd2.service
# systemctl reload apache2
# chown -R apache:apache /var/www/html/extra
# chmod -R 755 /var/www/html/extra
# systemctl reload httpd2.service

Создание собственного репозитория

Задача: создать собственный репозиторий со своими пакетами.

Добавляем свой компонент

Новый компонент будет называться extra.

Репозиторий будет находится в каталоге /var/www/html/extra/branch/p11/. Создадим необходимую структуру для нового компонента:

# mkdir -p /var/www/html/extra/branch/p11/x86_64/RPMS.extra

где:

  • x86_64 — архитектура компонента;
  • extra — суффикс компонента.

Наполнение компонента и создание индексов

Установим apt-repo-tools:

# apt-get install apt-repo-tools

Скопируем пакеты RPM в каталог /var/www/html/extra/branch/p11/x86_64/RPMS.extra:

# cp -v *.rpm /var/www/html/extra/branch/p11/x86_64/RPMS.extra

Создание ключей GPG

Создаем пару ключей GPG:

# gpg --gen-key
Выберите тип ключа:
   (1) RSA и RSA (по умолчанию)
   (2) DSA и Elgamal
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
Ваш выбор?

// Пишем 1. Так как нам необходим тип ключа RSA и RSA

длина ключей RSA может быть от 1024 до 4096 бит.
Какой размер ключа Вам необходим? (2048)

// Пишем размер ключа 2048

Запрошенный размер ключа - 2048 бит
Выберите срок действия ключа.
         0 = без ограничения срока действия
      <n>  = срок действия - n дней
      <n>w = срок действия - n недель
      <n>m = срок действия - n месяцев
      <n>y = срок действия - n лет
Срок действия ключа? (0)

// Ставим 0 без ограничения срока действия.

Срок действия ключа не ограничен
Все верно? (y/N)

// Ставим y

Для идентификации Вашего ключа необходим ID пользователя. Программа создаст его
из Вашего имени, комментария и адреса электронной почты в виде:
    "Baba Yaga (pensioner) <yaga@deepforest.ru>"

Ваше настоящее имя: (Пишем наше настоящее имя)
Адрес электронной почты: (Пишем адрес электронной почты)
Комментарий: 
Вы выбрали следующий ID пользователя:
    "Repo Signer <admin@company.net>"

Сменить (N)Имя, (C)Комментарий, (E)адрес или (O)Принять/(Q)Выход?

// Пишем O (Принять)

Для защиты секретного ключа необходима фраза-пароль.

Далее, система предложит сгенерировать случайные числа. Для этого нужно следовать инструкции, которая будет написана в нашем терминале (движение мышкой, набор текста и т.д).

В конце, когда сформируется отпечаток ключа GPG, можно увидеть сформированный ID. Пример:

pub   2048R/AE3F8179 2022-04-20
      Отпечаток ключа = 5C1D 67E3 F163 EC94 A1BC  202B 68E6 302C AE3F 8179

где, AE3F8179 — ID GPG ключа

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

Теперь необходимо применить наш ID GPG ключа для создания и подписи индексов:

# genbasedir --create --bloat --progress --sign --default-key=AE3F8179 --topdir=/var/www/repo/extra x86_64 extra
Внимание! Обратите внимание, что в поле --default-key нужно использовать наш ID (в данном случае AE3F8179).


Далее, вводим фразу-пароль для доступа к секретному ключу пользователя.

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

  1. Создаем файл:
    # nano /etc/apt/vendors.list.d/own.list
    
  2. И в этом файле (own.list) прописываем отпечаток ключа (fingerprint) и имя:
    simple-key "own" {
           Fingerprint "5C1D67E3F163EC94A1BC202B68E6302CAE3F8179";
           Name "Ваше имя <ваша электронная почта>";
    }
    
Внимание! Не забудьте поставить ; после поля Fingerprint и name.


Внимание! Отпечаток (Fingerprint) необходимо указать без пробелов.


Импортируем публичный ключ в общую базу alt-gpgkeys:

# gpg --output ~/repo.gpg --export AE3F8179
# gpg --no-default-keyring --keyring /usr/lib/alt-gpgkeys/pubring.gpg --import ~/repo.gpg
Внимание! При обновлении пакета alt-gpgkeys ключ подписи репозитория будет удалён. Необходимо или поставить пакет alt-gpgkeys на Hold (https://www.altlinux.org/Hold) или написать filetrigger по добавлению ключа в эту базу при обновлении пакета. Пример опакечивания такого filetrigger см. ниже. Но следует иметь ввиду, что внесение изменений в связку ключей несёт риск утраты к ней доверия со стороны пользователей, а для сертифицированных ОС это ещё и нарушение КСЗ дистрибутива, не допускаемое формуляром.


Создание собственного репозитория подписанного ключами вендоров

В октябре 2025 года в Сизиф был отправлен пакет apt-gpgkeys-pki.

Исходный код компонента опубликован на altlinux.space - https://altlinux.space/ALTLinux/apt-gpgkeys-pki.

Утилита пакета

В пакете имеется утилита apt-gpgkeys, у которой имеется две команды:

  • list
  • update

Технические тонкости

Источники ключей располагаются в каталоге /usr/lib/alt-gpgkeys/, к которому доимпортируются ключи из /usr/share/pki/apt-gpg/sources/ и /etc/pki/apt-gpg/sources.

Принцип реализации аналогичен ca-trust.

Будущий функционал

Обработка каталогов blacklist заложено, но пока не реализовано.

Как теперь "распространять" свой репозиторий

Теперь, опубликовав и подписав свой репозиторий с пакетами, провайдер может "упаковать конфиги в пакет":

  • /etc/apt/sources.list.d/ИМЯ.list
  • публичную часть ключа в /usr/share/pki/apt-gpg/sources/
  • fingerprint ключа в /etc/apt/vendors.list.d/ИМЯ.list

Необходимый триггер выполняется apt при установке пакета автоматически.

Пример репозитория

list-файл

Путь: /etc/apt/sources.list.d/angie-pro.list

rpm [angie] https://download.angie.software/angie-pro/altlinux/10/ x86_64 main
Публичная часть

Путь: /etc/apt/vendors.list.d/angie.list

simple-key "angie" {
	Fingerprint "EB8EAF3D4EF1B1ECF34865A2617AB978CB849A76";
	Name "Angie (Signing Key) <devops@tech.wbsrv.ru>";
}
Конфиг-файл

Путь: /etc/apt/apt.conf.d/angie-pro.conf

Acquire::https::Verify-Peer "true";
Acquire::https::Verify-Host "true";
Acquire::https::SslCert     "/etc/ssl/angie/angie-repo.crt";
Acquire::https::SslKey      "/etc/ssl/angie/angie-repo.key";
Триггер

Путь: /usr/lib/rpm/angie-pro.filetrigger

#!/bin/sh -efu

ANGIE_KEYF=/etc/ssl/angie/angie-signing.gpg
ANGIE_KEYID=617AB978CB849A76
PUBRING=/usr/lib/alt-gpgkeys/pubring.gpg

[ -s $ANGIE_KEYF ] && grep -F -qx $PUBRING || exit 0
gpg --list-packets $PUBRING |grep -F -qs "keyid: $ANGIE_KEYID" ||
	gpg --keyring $PUBRING --no-default-keyring --import $ANGIE_KEYF

Файл ключа
  • Путь: /etc/ssl/angie/angie-signing.gpg
  • Публичная часть ключа: /usr/lib/alt-gpgkeys/pubring.gpg

Создание пакета с репозиторием

По статье Сборка пакетов start:

  • Генерируем ключи
  • Устанавливаем и настраиваем пакеты для сборки
  • Делаем вариант "пакет с нуля" с некоторыми аспектами
Структура
home
└── myrepo
    |  ├── reponame.list
    |  ├── fingerprint.list
    |  ├── myrepo.conf
    |  ├── signing-key.gpg
    |  └── public-key.gpg
    ├── .gear
    │   └── rules
    └── .git
Файл gear/rules
tar.gz: myrepo name=myrepo
Файл спека
Name: myrepo
Version: 1.0
Release: alt1

Summary: ALT repository by me
Group: System/Configuration/Packaging
License: GPL v3

ExclusiveArch: x86_64
BuildArch: noarch

Url: https://my-repo.ru

Requires: apt-conf

Source0: %name.tar.gz

%description
This package contains just a link to the ALT repository by me.

%prep
%setup

%install
install -m 0755 %{SOURCE0}/reponame.list %buildroot/etc/apt/sources.list.d/reponame.list
install -m 0755 %{SOURCE0}/fingerprint.list %buildroot/etc/apt/vendors.list.d/reponame.list
install -m 0755 %{SOURCE0}/myrepo.conf %buildroot/etc/apt/apt.conf.d/reponame.conf
install -m 0755 %{SOURCE0}/signing-key.gpg %buildroot/etc/ssl/angie/developer-key.gpg
install -m 0755 %{SOURCE0}/public-key.gpg  %buildroot/usr/lib/alt-gpgkeys/developer-public.gpg

%files
/etc/apt/sources.list.d/reponame.list
/etc/apt/vendors.list.d/reponame.list
/etc/apt/apt.conf.d/reponame.conf
/etc/ssl/angie/developer-key.gpg
/usr/lib/alt-gpgkeys/developer-public.gpg

%changelog
* Mon Dec 01 2025 Anatoliy Agranovskiy <agranovskiy@altlinux.ru> 1.0-alt1
- Initial build
Как упаковать конфигурацию репозитория

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

В данном разделе мы рассмотрим создание такого пакета.

НО,

Во-первых, вы должны обладать базовыми знаниями по сборке пакетов. Если вы не умеете собирать пакеты, прямо совсем-совсем, никто не хочет становиться вашим ментором и учить и пр, не переживайте, на нашей вики есть статья по сборке пакетов для начинающих.

Итак, вы более-менее знаете, как собирать пакеты.

Рассмотрим, как должен выглядеть gear-репозиторий, спек и пр. у пакета с репозиторием.

Пример 1

Пакет: apt-conf-netpolice.

apt-conf-netpolice
├── .gear-rules
├── apt-conf-netpolice.spec
└── netpolice.list

.gear-rules содержит:

tar: . name=@name@-@version@ base=@name@-@version@

Файл List:

rpm http://repo.netpolice.ru/altlinux/p10/branch x86_64 cair

Файл Spec:

Name: apt-conf-netpolice
Summary: Official repository of Netpolice applications for ALT
Version: 1.0
Release: alt1

License: Public-Domain
Group: System/Base
URL: https://www.netpolice.ru/page/getnetpolicelinux

ExclusiveArch: x86_64

Source: %name-%version.tar

%description
%{summary}.
Available packages: NetPoliceAltLinux

%prep
%setup

%install
install -Dpm 0644 netpolice.list %buildroot%_sysconfdir/apt/sources.list.d/netpolice.list

%files
%config(noreplace) %_sysconfdir/apt/sources.list.d/netpolice.list

%changelog
* Wed Oct 02 2024 Andrey Cherepanov <cas@altlinux.org> 1.0-alt1
- Initial build for Sisyphus.

Смотрим спек:

  • Имя, описание, версия, релиз, исходники — все как обычно.

Лицензия — Public Domain

  • Группа — System/Base
  • Ссылка — как обычно
  • ExclusiveArch — архитектура, для которой предназначены файлы репозитория

«Сборка пакета» представляет собой обычную распаковку архива с помощью %setup, установки в файла .list, содержащего адрес репозитория для x86_64 в /etc/apt/sources.

И указывается что в пакет будет добавлен этот list-файл.

Пример 2

Пакет: apt-conf-rutoken.

apt-conf-rutoken
└── apt-conf-rutoken.spec

.gear-rules содержит:

tar: .

Файл Spec:

Name: apt-conf-rutoken
Summary: Official repository of Rutoken software for ALT
Version: 1.0
Release: alt1

License: Public-Domain
Group: System/Base
URL: https://www.rutoken.ru/

ExclusiveArch: %ix86 x86_64 aarch64

Source: %name-%version.tar

Requires: apt-https

%description
%{summary}.

Available packages: libnpRutokenPlugin, librtengine1, librtpkcs11ecp and
rtcontrolcenter.

%prep
%setup
%ifarch %ix86
echo "rpm https://repo.rutoken.ru alt/stable/i586 classic" > rutoken.list
%endif
%ifarch x86_64
echo "rpm https://repo.rutoken.ru alt/stable/x86_64 classic" > rutoken.list
%endif
%ifarch aarch64
echo "rpm https://repo.rutoken.ru alt/stable/aarch64 classic" > rutoken.list
%endif

%install
install -Dpm 0644 rutoken.list %buildroot%_sysconfdir/apt/sources.list.d/rutoken.list

%files
%config(noreplace) %_sysconfdir/apt/sources.list.d/rutoken.list

%changelog
* Wed Nov 27 2024 Andrey Cherepanov <cas@altlinux.org> 1.0-alt1
- Initial build for Sisyphus.

Смотрим спек:

  • Имя, описание, версия, релиз, исходники — все как обычно.
  • Лицензия — Public Domain
  • Группа — System/Base
  • Ссылка — как обычно
  • ExclusiveArch — архитектура, для которой предназначены файлы репозитория
  • Available packages: libnpRutokenPlugin, librtengine1, librtpkcs11ecp and

rtcontrolcenter.

  • В качестве зависимости указано apt-https — т.к.используется https

List-файл создается во время сборки пакета в зависимости от архитектуры:

  • ix86:
https://repo.rutoken.ru alt/stable/i586
  • x86_64:
https://repo.rutoken.ru alt/stable/x86_64 classic
  • aarch64:
https://repo.rutoken.ru alt/stable/aarch64

«Сборка пакета» представляет собой создание файла .list в зависимости от собираемой архитектуры и содержащего соответствующий адрес репозитория в /etc/apt/sources.

И указывается что в пакет будет добавлен этот list-файл.

Примеры пакетов

Ссылка на ваш репозиторий может быть опакечена в основной репозиторий любым маинтейнером.

  1. Только ссылка на репозиторий: https://git.altlinux.org/gears/a/akvis-repo.git
  2. Ссылка с GPG-подписью: https://git.altlinux.org/gears/a/angie-pro-repo.git
  3. Ещё вариант с GPG: https://git.altlinux.org/gears/a/ascon-repo.git

Добавление репозитория

Добавляем свой репозиторий с ключом для проверки (должен быть установлен пакет apt-repo):

# apt-repo add "rpm [own] file:/var/extra x86_64 extra"