Prototype stable macOS permission identity without Developer ID - #74
Draft
IgorArkhipov wants to merge 7 commits into
Draft
Prototype stable macOS permission identity without Developer ID#74IgorArkhipov wants to merge 7 commits into
IgorArkhipov wants to merge 7 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 — как ожидалось, права после контейнера восстановлены, закоммиченные иконки не перезаписаны.
Compile release binaries before unlocking the project signing key, restrict the imported identity to codesign, and reject certificate rotation unless its approved fingerprint is updated. Exercise the split compile/package path in pull-request CI and cover the designated-requirement generator directly.
IgorArkhipov
force-pushed
the
igor/macos-stable-release-signing
branch
from
August 31, 2026 19:47
0856393 to
9f90f13
Compare
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.
Problem
Entropy's existing macOS release artifacts use ad-hoc signatures. Each changed binary receives a new
cdhash-only designated requirement, so macOS can show Accessibility or Input Monitoring as enabled while rejecting the updated app.Entropy does not have Apple Developer Program membership, so Developer ID signing and notarization are unavailable.
Fix
com.ergohaven.entropydesignated requirement./usr/bin/codesignduring packaging.MACOS_SIGNING_CERTIFICATE_SHA1and reject an unexpected or rotated P12 identity.Security and distribution constraints
Verification
cargo test --locked- 653 passed.scripts/test_macos_stable_signing.shpassed.scripts/test_macos_stable_identity_e2e.shpassed on macOS 26.6.2 arm64: two binaries produced different code hashes and the same certificate-root plus bundle-ID designated requirement..app,.app.zip, and.dmgwithout invoking Cargo while the key was available.git diff --checkpassed.main.Hosted Intel execution and two-build TCC persistence remain unverified.
Repository owner steps before Ready for review
v0.*tags that restricts tag creation, updates, and deletion to trusted release maintainers and blocks force updates.Entropy Open Source Release SigningSelf Signed RootCode Signing.p12. Store the P12 and password in a maintainer-controlled offline backup.ergohaven/entropy:MACOS_CERTIFICATE_P12_BASE64: output ofbase64 -i entropy-release-signing.p12MACOS_CERTIFICATE_PASSWORD: the P12 export passwordMACOS_SIGNING_CERTIFICATE_SHA1with the approved 40-character certificate SHA-1 fingerprint without colons.Manual release gate
Keep this PR in draft until both architectures pass:
/Applications/Entropy.app.If macOS requests permissions again, do not ship this signing path.
Related: #6
Related: #58