Prototype stable macOS permission identity without Developer ID - #74
Draft
IgorArkhipov wants to merge 6 commits into
Draft
Prototype stable macOS permission identity without Developer ID#74IgorArkhipov wants to merge 6 commits into
IgorArkhipov wants to merge 6 commits into
Conversation
IgorArkhipov
marked this pull request as draft
July 13, 2026 01:40
IgorArkhipov
force-pushed
the
igor/macos-stable-release-signing
branch
from
July 28, 2026 02:21
5718a9b to
0856393
Compare
jidckii
added a commit
to jidckii/entropy
that referenced
this pull request
Aug 4, 2026
Ветка в текущем виде не поехала бы ни в PR-гейте, ни в релизе: часть проблем ломала сборку сразу, часть — только в CI, где их некому было бы заметить до первого тега. Блокеры сборки: - macOS падал и в PR, и в релизе: build_macos_app.sh требует assets/entropy.icns, но файл лежал в .gitignore, а ни macos:app, ни workflow его не генерировали. На раннере он и не сгенерировался бы — там нечем растеризовать SVG. Теперь .icns закоммичен рядом с .ico, и clean его не трогает. - Dockerfile не собирался с zig 0.16: с 0.15 у ziglang поменялась схема имён архивов (zig-<arch>-linux-, а не zig-linux-<arch>-), был 404. - appimagetool 1.9.1 качает runtime с GitHub на каждой сборке и виснет без таймаута, если соединение оборвалось (проверено — 17 минут в CLOSE-WAIT). В CI это тихий простой job'а до его лимита, хотя Dockerfile обещал сборку без сети. Runtime теперь пиннут и передаётся через --runtime-file, у curl появились таймауты. - task windows:* и macos:cross не работали при asdf: ZIG резолвился в shim, а cargo запускает build script из каталога крейта в реестре, где .tool-versions не находится — shim печатает подсказку вместо версии, и cargo-zigbuild падает на разборе semver. Резолвим реальный бинарник. Публикация релиза: - В GitHub Release уезжал мусор: dist/**/* тянул сгенерированный конфиг nfpm, а dist/macos/* — распакованный Entropy.app целиком. Пути теперь перечислены явно, плюс if-no-files-found: error. - Версия артефактов бралась из Cargo.toml, поэтому предрелиз v0.3.2-rc.1 выложил бы файлы с именами будущего стабильного v0.3.2, а deb/rpm — с неотличимой версией пакета. VERSION прокидывается из тега сквозь Taskfile, контейнер и скрипты; nfpm сам разворачивает суффикс в 0.3.2~rc.1. MSI ProductVersion и CFBundleVersion принимают только числовые компоненты, поэтому для них суффикс отбрасывается отдельно. - Всё, что можно проверить до сборки, ушло в validate: формат тега, наличие секции в CHANGELOG и сверка с Cargo.toml. Раньше отсутствие секции роняло релиз уже после десятков минут сборки. Заодно это страхует расширенный фильтр тегов: легаси-теги v1.13.x/v1.14.x, что живут в репозитории, отсекаются обеими проверками. - Образ для docker:dist пересобирался на каждом релизе с нуля, включая компиляцию cargo-zigbuild и libdmg-hfsplus. Собираем его отдельным шагом с кэшем слоёв, а DOCKER_IMAGE_READY выключает повторную сборку. Уклад upstream: - build.yml вернулся к матрице upstream: снова два macOS-раннера по одной арке. Универсальный бандл нужен релизу, а в PR-гейте он лишь удваивал время; кроме того, job "Build (macos-15-intel)" мог быть прописан в required checks, и его пропажа подвесила бы все PR. Дифф к upstream сузился до concurrency и расширения артефакта. - build_macos_app.sh снова понимает TARGET (одна арка) — так workflow не расходится с upstream и с открытым PR ergohaven#74. Пакеты: - В packaging/linux/59-vial.rules не хватало второго правила — для устройств по Bluetooth, где серийный номер Vial в hidraw не виден. Пользователи deb/rpm/arch не получили бы доступ к BLE-клавиатурам. - В зависимости добавлен libwayland-client: eframe собран с фичей wayland и грузит его через dlopen. - prepare теперь проверяет не имена пакетов, а сами инструменты, и сообщает, чего не хватает: набор пакетов покрывает дистрибутивы неравномерно (в alpine нет msitools и icnsutils), и раньше нехватка всплывала на середине сборки. - zig и cargo-zigbuild выровнены между .tool-versions, Dockerfile и prepare_env.sh: линия cargo-zigbuild рассчитана на конкретный zig, поэтому они должны двигаться вместе. Проверено сборкой с VERSION=0.3.2-rc.1: нативно linux:pkg, linux:appimage и windows:all, затем полный docker:dist в контейнере с нуля. Метаданные deb/rpm, ProductVersion в MSI и содержимое AppImage — как ожидалось, права после контейнера восстановлены, закоммиченные иконки не перезаписаны.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
EN
Summary
Entropy v0.1.5 and v0.2.0 use ad-hoc signatures.
Each changed binary gets a different
cdhash-only designated requirement, so macOS can show Accessibility as enabled whileAXIsProcessTrusted()rejects the updated app.Release builds embed an explicit requirement anchored to that certificate plus
com.ergohaven.entropy.No Apple Developer account or notarization credentials are required.
Limits and security
Validation
.app, ZIP, and DMG build succeeds with temporary self-signed identity.codesignverification and failsspctlas expected.shellcheck,actionlint, andgit diff --checkpass.Repository owner steps before Ready for review
Green PR checks do not prove that upstream signing credentials exist.
A repository owner/admin must complete steps below first:
On a Mac, open Keychain Access > Certificate Assistant > Create a Certificate.
Create one identity with exact settings:
Entropy Open Source Release SigningSelf Signed RootCode SigningExport certificate and private key together as an encrypted
.p12file.Store
.p12and its password in maintainer-controlled offline backup. Never commit or upload private material as a release artifact.Copy base64-encoded P12 value:
base64 -i entropy-release-signing.p12 | pbcopyIn upstream repository Actions secrets settings, create these repository secrets with exact names:
MACOS_CERTIFICATE_P12_BASE64: complete base64 value copied aboveMACOS_CERTIFICATE_PASSWORD:.p12export passwordConfirm secrets are stored in upstream
ergohaven/entropy. Secret values cannot be viewed again after saving.Use this same P12 for every release. Key loss or rotation changes app identity and forces users to grant permissions again.
Produce two different signed builds with this identity and complete manual TCC test below on Apple Silicon and Intel.
Click Ready for review only after both machines retain Accessibility/Input Monitoring without re-adding Entropy.
Manual release gate
Keep PR Draft. Before merge or release:
/Applications/Entropy.app.If TCC still requests permissions, do not ship this path. Fall back to ad-hoc artifacts plus explicit permission-reset UX.
RU
Кратко
https://t.me/c/1464748383/37027/131541
PR использует постоянный self-signed release certificate. Он создаёт одинаковый certificate-anchored designated requirement для разных бинарников и потенциально сохраняет TCC identity без Apple account.
Ограничения: Apple не рекомендует shipping self-signed apps, Gatekeeper продолжит отклонять artifact, приватный ключ нужно хранить как release secret, а реальное сохранение Accessibility/Input Monitoring ещё нужно проверить двумя последовательными builds на Apple Silicon и Intel.
Что должны сделать владельцы репозитория до Ready for review
Зеленые PR checks не подтверждают наличие signing credentials.
Оставшиеся необходимые шаги для создания сертификата подписи:
Entropy Open Source Release Signing: Self Signed Root, Code Signing, с большим сроком действия..p12..p12и пароль в защищенную резервную копию. Не коммитить и не прикладывать эти данные к релизу.base64 -i entropy-release-signing.p12 | pbcopy.MACOS_CERTIFICATE_P12_BASE64: полный base64 из предыдущего шагаMACOS_CERTIFICATE_PASSWORD: пароль экспорта.p12ergohaven/entropy, а не только в fork.До этого PR остается Draft. Bundle-ID-only requirement не используется: это небезопасно для Accessibility grants.
Related: #6
Related: #58