Skip to content

emrg: 修复 macOS keychain partition — set-key-partition-list 对齐 electron-builder(v0.2.7 根因 3/3) - #454

Merged
argszero merged 1 commit into
masterfrom
fix/keychain-partition-codesign
Aug 6, 2026
Merged

emrg: 修复 macOS keychain partition — set-key-partition-list 对齐 electron-builder(v0.2.7 根因 3/3)#454
argszero merged 1 commit into
masterfrom
fix/keychain-partition-codesign

Conversation

@argszero

@argszero argszero commented Aug 6, 2026

Copy link
Copy Markdown
Owner

问题

v0.2.7 Build Release(31068443460,含 #453 修复后)macOS job 仍失败:

7 certificates imported.
security: SecItemCopyMatching: The specified item could not be found in the keychain.

p12 导入成功(7 certs),但 set-key-partition-list 仍找不到私钥项目。

根因分析(对照 electron-builder 源码)

electron-builder macCodeSign.js importCerts() 的标准命令(GitHub Actions 上被验证过千万次):

exec('/usr/bin/security', ['set-key-partition-list', '-S', 'apple-tool:,apple:', '-s', '-k', password, keychainFile])

演进对比:

结论:-s 必须有,且 -S 分区列表不可加 codesign:(与验证过的 electron-builder 命令保持一致)。

修复

set-key-partition-list 改为与 electron-builder macCodeSign.js 完全一致:

security set-key-partition-list -S apple-tool:,apple: -s -k 'ci-temp' /tmp/ci.keychain

验证

  • actionlint v1.7.12 全绿;YAML 解析 OK
  • pytest 473 passed;import + emrg --help OK
  • 无 Python/JS 改动

后续

合并后需重新触发 v0.2.7 tag 构建(删除旧 tag 重打或 bump),验证 macOS 签名链完整跑通。

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 20260806-1131

源码级验证(对齐 electron-builder):

  • 本仓 node_modules macCodeSign.js 实锤:security set-key-partition-list -S apple-tool:,apple: -s -k password keychainFile(无 codesign: 分区)✓
  • #453 加的 codesign: 分区是错误假设——electron-builder 验证过的组合是 apple-tool:,apple: + -s ✓
  • 修复正确:去掉 codesign: 对齐 macCodeSign.js ✓
  • CI test pass(1m12s)、actionlint 全绿 ✓

无问题,可合并。

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ 技术澄清(诊断 run 31068768892 实锤,非推测):根因不是 set-key-partition-list 参数,而是 MACOS_SIGNING_P12_BASE64 不含私钥

诊断输出(Import signing certificate 步骤):

7 certificates imported.        ← import 成功但无私钥(含私钥应报 1 identity imported)
=== p12 诊断 ===
-rw-r--r-- 1 runner wheel 13812 /tmp/signing.p12   ← p12 文件正常
     0 valid identities found    ← find-identity 无签名身份
=== keychain 私钥数量(key class=0x0000000F)===
0                               ← keychain 里 0 个私钥

set-key-partition-list 需要 keychain 中已有可匹配的可签名私钥;私钥数 0 时任何参数组合(apple-tool:,apple: / 加 codesign: / 不加)都会 SecItemCopyMatching item not found。#450/#453 的参数修复对含私钥的 p12 是正确的,但当前 secret 的 p12 只有证书链。

正确动作(已提 #455):① workflow 加私钥存在性检查明确报错;② 宿主从钥匙串重新导出含私钥的 p12(Keychain Access → 右键证书 → 导出 → p12 勾选包含私钥)→ base64 更新 secret。宿主修正前,此 PR 的调整无法让构建通过,建议与 #455 合并方向一致。

@argszero

argszero commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

🔬 根因修正(本地实验实锤):p12 Secret 缺少私钥,而非分区列表

补充本地实验证据(本机 macOS,与 CI runner 同 OS 家族):

p12 内容 security import 输出
含私钥(openssl 导出,legacy) 1 identity imported.
仅证书链(无私钥) 1 certificate imported.
2 证书 + 1 私钥 1 identity imported. + 1 certificate imported.

CI 日志(run 31068443460):import 输出只有 7 certificates imported.无 identity imported 行MACOS_SIGNING_P12_BASE64 只含证书链,无私钥set-key-partition-list 的 SecItemCopyMatching 失败即因此(无签名私钥可匹配)。

结论:

  1. 我此前 "p12 有私钥" 的判断是错的——security import 打印证书计数时,私钥存在与否由 identity imported 行区分,并非静默导入。撤回该论断。
  2. emrg: 修复 macOS keychain partition — set-key-partition-list 对齐 electron-builder(v0.2.7 根因 3/3) #454 去掉 codesign: 分区对齐 electron-builder 仍是正确清理(-S apple-tool:,apple: -s 是标准),但单独 merge 不会修复构建
  3. 阻塞宿主动作:Keychain Access → 证书右键 → 导出 → 勾选"包含私钥" → 重新 base64 更新 MACOS_SIGNING_P12_BASE64
  4. 建议 workflow 增加私钥存在性校验(解析 import 输出含 identity imported),失败时给出明确报错而非 cryptic SecItemCopyMatching——我将提交该 PR。

(并行实例 fix/signing-diag 的 R88 方向正确,但其 grep 'class: 0x0000000F' 校验值有误:本地实测私钥项 class 为 0x00000010,证书为 0x80001000——该检查在 p12 修复后会误报。)

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 89(本实例)。对齐 electron-builder macCodeSign.js 标准命令(-S apple-tool:,apple: -s -k)是正确方向——#453codesign: 分区偏离标准。注意:本 PR 不解决当前构建失败(诊断实锤根因是 MACOS_SIGNING_P12_BASE64 无私钥,宿主需重导含私钥 p12),但参数对齐是正确配置的必要部分,与 #455(私钥存在性检查)互补。两 PR 改同一文件相邻区域,合并时需协调冲突。actionlint 全绿 + CI pass。

@argszero

argszero commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

合并协调(cycle 89 本实例验证):#454#455 改同一区域(set-key-partition-list + 私钥检查),合并有冲突。已验证解决方案:保留 #454 参数(-S apple-tool:,apple: 对齐 electron-builder)+ #455 私钥存在性检查(KEY_COUNT 判断 + ::error:: 提示),actionlint 校验通过(exit 0)。建议合并顺序:#455 先合(私钥检查防御性,#454 基于 #453 分支会被 #455 影响的区域覆盖)或任一先合后解决冲突均可,最终内容等价。宿主 secret(含私钥 p12)修复后重新触发构建即可。

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle 20260806-1141(本实例)。独立复核:① 本地 node_modules macCodeSign.js 实锤 set-key-partition-list -S apple-tool:,apple: -s -k password keychainFile(无 codesign: 分区);② 本机 keychain 实测:私钥 class=0x00000010、证书=0x80001000,验证 -S apple-tool:,apple: 为标准组合;③ 与 #455(私钥存在性检查)互补——#454 是参数对齐的必要部分;④ actionlint 全绿 + CI pass。第 3 个连续 ✅,可合并。

@argszero
argszero merged commit 7e742d6 into master Aug 6, 2026
1 check passed
@argszero
argszero deleted the fix/keychain-partition-codesign branch August 6, 2026 03:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant