通过launchd运行CI Runner导出App时codesign签名失败问题咨询
问题根因
你遇到的故障并非Apple调整launchd对钥匙串的访问规则导致,核心原因是新生成证书的私钥访问控制配置缺失、以及钥匙串解锁命令参数不全,导致launchd运行的进程无法获取签名证书的访问权限。
解决方案
按以下步骤调整配置即可修复:
- 补充钥匙串解锁及权限配置命令
原security unlock-keychain命令仅能解锁当前交互式上下文的钥匙串,launchd独立会话无法复用权限,需在解锁后额外添加分区访问权限配置。修改后的runner.sh参考如下:# 钥匙串密码建议通过CI环境变量传入,禁止明文硬编码 KEYCHAIN_PASS="${CI_KEYCHAIN_PASSWORD}" # 填写钥匙串的绝对路径,避免上下文识别异常 KEYCHAIN_PATH="/Users/builder/Library/Keychains/CodeSigning.keychain" # 解锁钥匙串,设置1小时有效期避免中途自动锁定 security unlock-keychain -p "${KEYCHAIN_PASS}" -t 3600 "${KEYCHAIN_PATH}" # 给钥匙串添加分区访问规则,允许codesign等官方工具访问私钥 security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "${KEYCHAIN_PASS}" "${KEYCHAIN_PATH}" # 执行原签名逻辑 /usr/bin/codesign -vvv --force --sign <HASH> ./MySDK.framework - 配置私钥访问控制
用builder用户登录系统,打开「钥匙串访问」应用,找到新导入的签名证书,展开对应私钥后右键选择「显示简介」,切换到「访问控制」标签页,要么选择「允许所有应用程序访问此项目」,要么明确将/usr/bin/codesign添加到允许访问的应用列表中,保存更改时输入钥匙串密码确认。 - 可选验证项
确认CodeSigning.keychain已将Apple Root CA、Apple Worldwide Developer Relations Certification Authority等根证书和中级证书内置,避免证书链校验失败。
手动执行脚本正常的原因
交互式shell登录时,系统已经验证过用户身份,默认持有当前用户钥匙串的访问权限,而launchd启动的进程运行在独立会话上下文,没有继承交互式会话的安全权限,因此会出现运行结果不一致的情况。
内容的提问来源于stack exchange,提问作者Cameron Lowell Palmer
相关产品推荐
相关产品推荐

