155 lines
5.8 KiB
Markdown
155 lines
5.8 KiB
Markdown
# Signed OpenWrt package repository
|
|
|
|
Agent release tags automatically publish the current OpenWrt support tier:
|
|
|
|
- OpenWrt 24.10 and 25.12;
|
|
- `x86/64`, `ramips/mt7621`, `ath79/generic`, `ipq40xx/generic` and
|
|
`mediatek/filogic`.
|
|
|
|
OpenWrt 21.02, 22.03 and 23.05 packages are added to an existing agent release by the
|
|
manual legacy workflow described below. The default public base URL is:
|
|
|
|
```text
|
|
https://benya9669.github.io/openwrt-rmm/feeds/stable/openwrt
|
|
```
|
|
|
|
Before the first release, open **Repository settings → Pages** and select **GitHub
|
|
Actions** as the deployment source. A custom domain such as `packages.daemonlord.ru`
|
|
can be attached later in the same Pages settings; keep the GitHub Pages URL available
|
|
until DNS and TLS for the custom domain have been verified.
|
|
|
|
## Signing keys
|
|
|
|
Keep private keys offline and out of the repository. Generate them on a trusted Linux or
|
|
WSL host with `usign` and OpenSSL installed:
|
|
|
|
```sh
|
|
umask 077
|
|
mkdir -p release-keys
|
|
usign -G \
|
|
-s release-keys/openwrt-usign.sec \
|
|
-p release-keys/openwrt-usign.pub \
|
|
-c "OpenWrt RMM package repository"
|
|
openssl ecparam -name prime256v1 -genkey -noout \
|
|
-out release-keys/openwrt-apk.pem
|
|
openssl ec -in release-keys/openwrt-apk.pem -pubout \
|
|
-out release-keys/openwrt-apk.pub.pem
|
|
```
|
|
|
|
Back up `openwrt-usign.sec` and `openwrt-apk.pem` in an encrypted offline location.
|
|
The files under `release-keys/` are ignored by Git.
|
|
|
|
Encode the keys without printing private material into CI logs:
|
|
|
|
```sh
|
|
base64 -w0 release-keys/openwrt-usign.sec > release-keys/openwrt-usign.sec.b64
|
|
base64 -w0 release-keys/openwrt-apk.pem > release-keys/openwrt-apk.pem.b64
|
|
```
|
|
|
|
Create these GitHub Actions repository secrets from the corresponding `.b64` files:
|
|
|
|
| Secret | Source file |
|
|
| --- | --- |
|
|
| `OPENWRT_USIGN_SECRET_B64` | `openwrt-usign.sec.b64` |
|
|
| `OPENWRT_APK_SECRET_B64` | `openwrt-apk.pem.b64` |
|
|
|
|
The public keys are committed under `keys/openwrt/`. Their expected identifiers are:
|
|
|
|
- usign key ID: `7fb0908fb6bc82c8`;
|
|
- APK public key SHA256: `ce6f190c937961db306ddc3cbe138a877157d97252a2c8290980c43fc4f55f26`.
|
|
|
|
The release build verifies that each private key matches the committed public key before
|
|
publishing a signed feed.
|
|
|
|
An `agent-v*` release and the legacy publication workflow fail closed when a required
|
|
native signing key is missing. A manual run of the general **Build and test** workflow
|
|
may still create unsigned test artifacts, but it does not publish them. BuildKit secret
|
|
mounts expose private keys only to the repository-index build step; private keys are not
|
|
copied into images, artifacts or build cache.
|
|
|
|
## Support tiers and legacy packages
|
|
|
|
The normal `agent-v*` workflow builds ten current package targets. This keeps the release
|
|
gate fast and prevents an obsolete SDK from blocking packages for supported OpenWrt
|
|
versions.
|
|
|
|
To extend the latest agent release with signed OpenWrt 21.02, 22.03 and 23.05 packages,
|
|
run **Actions → Build legacy OpenWrt packages → Run workflow** from the default branch
|
|
and enter its existing tag, for example `agent-v0.6.7`. The same operation is available
|
|
through GitHub CLI:
|
|
|
|
```sh
|
|
gh workflow run build-legacy.yml -f agent_tag=agent-v0.6.7
|
|
```
|
|
|
|
Run it only after the main agent release has completed. The legacy workflow:
|
|
|
|
1. checks out and builds the exact agent tag;
|
|
2. signs the IPK repositories with the configured `usign` key;
|
|
3. combines them with the current release and reconstructs the complete repository;
|
|
4. refreshes signed checksums and uploads the legacy files to the existing GitHub Release;
|
|
5. redeploys the complete current plus legacy repository to GitHub Pages.
|
|
|
|
The workflow refuses an older agent tag because publishing it would roll the `stable`
|
|
feed back from the latest agent version.
|
|
|
|
The legacy matrix contains `x86/64`, `ramips/mt7621`, `ath79/generic` and
|
|
`ipq40xx/generic`; OpenWrt 23.05 also contains `mediatek/filogic`.
|
|
`bcm27xx/bcm2711` is intentionally on-demand and should be added only when a supported
|
|
Raspberry Pi 4 installation needs a package.
|
|
|
|
## OpenWrt 24.10 and older: IPK/opkg
|
|
|
|
Choose the directory matching the firmware release and target. For example MT7621 on
|
|
OpenWrt 24.10:
|
|
|
|
```sh
|
|
feed='https://benya9669.github.io/openwrt-rmm/feeds/stable/openwrt/24.10.7/ramips-mt7621'
|
|
key_base='https://benya9669.github.io/openwrt-rmm/keys/usign'
|
|
key_id='7fb0908fb6bc82c8'
|
|
|
|
wget -O "/etc/opkg/keys/${key_id}" "${key_base}/${key_id}"
|
|
printf 'src/gz rmm %s\n' "$feed" > /etc/opkg/customfeeds.conf.d/rmm.conf
|
|
opkg update
|
|
opkg install rmm-agent-go-production luci-app-rmm-agent
|
|
```
|
|
|
|
The workflow creates `Packages`, `Packages.gz` and `Packages.sig`. `opkg` verifies the
|
|
signature of the repository metadata and the package hashes contained in that metadata.
|
|
The key ID is the filename published under `/keys/usign/`.
|
|
|
|
## OpenWrt 25.12 and newer: APK
|
|
|
|
For MT7621 on OpenWrt 25.12:
|
|
|
|
```sh
|
|
base='https://benya9669.github.io/openwrt-rmm'
|
|
repo="${base}/feeds/stable/openwrt/25.12.4/ramips-mt7621/packages.adb"
|
|
|
|
wget -O /etc/apk/keys/rmm-openwrt.pem "${base}/keys/apk/rmm-openwrt.pem"
|
|
printf '%s\n' "$repo" > /etc/apk/repositories.d/rmm.list
|
|
apk update
|
|
apk add rmm-agent-go-production luci-app-rmm-agent
|
|
```
|
|
|
|
APK verifies the signed `packages.adb` index. Installation should not require
|
|
`--allow-untrusted`; needing that flag means the repository key or signature chain is
|
|
not configured correctly.
|
|
|
|
## Release verification
|
|
|
|
Release assets also include a keyless Sigstore bundle for the combined checksums:
|
|
|
|
```sh
|
|
cosign verify-blob \
|
|
--bundle SHA256SUMS.sigstore.json \
|
|
--certificate-identity-regexp \
|
|
'^https://github.com/Benya9669/openwrt-rmm/.github/workflows/(build\.yml@refs/tags/agent-v.*|build-legacy\.yml@refs/heads/main)$' \
|
|
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
|
|
SHA256SUMS
|
|
sha256sum --check SHA256SUMS
|
|
```
|
|
|
|
This Sigstore verification complements native package-manager trust; it does not replace
|
|
the `usign` or APK repository signature.
|