GitHub Actions macOS Runner证书安装默认钥匙链设置失败求助
macOS Runner 证书签名权限错误解决指南
问题原因
在GitHub Actions的macOS-12/macos-13 runner上,以root用户(UID=0)执行security default-keychain -s命令时,由于/Users/runner目录归属runner用户,root无修改权限,导致出现以下错误:
Will not set default: UID=0 does not own directory /Users/runner security: SecKeychainSetDefault: Write permissions error. Error: Process completed with exit code 1.
解决方案
方案1:切换到runner用户执行钥匙链操作
利用runner用户对/Users/runner目录的所有权,切换用户后完成钥匙链配置:
- 创建自定义钥匙链时,指定路径到runner用户的Keychains目录下
- 使用
su -l runner -c包裹钥匙链相关命令,以runner身份执行
示例GitHub Actions步骤:
- name: 配置签名用钥匙链 run: | # 创建自定义钥匙链 KEYCHAIN_PATH="/Users/runner/Library/Keychains/my-build.keychain-db" security create-keychain -p ${{ secrets.KEYCHAIN_PASS }} $KEYCHAIN_PATH # 切换到runner用户设置默认钥匙链 su -l runner -c "security default-keychain -s $KEYCHAIN_PATH" # 设置钥匙链超时,防止自动锁定 security set-keychain-settings -lut 3600 $KEYCHAIN_PATH # 导入Developer ID证书并授权签名工具访问 security import ./certs/developer_id_app.p12 -k $KEYCHAIN_PATH -P ${{ secrets.CERT_PASS }} -T /usr/bin/codesign security import ./certs/developer_id_installer.p12 -k $KEYCHAIN_PATH -P ${{ secrets.CERT_PASS }} -T /usr/bin/productbuild # 设置证书分区权限,避免签名时权限报错 security set-key-partition-list -S apple-tool:,apple: -s -k ${{ secrets.KEYCHAIN_PASS }} $KEYCHAIN_PATH
方案2:签名时直接指定钥匙链(无需修改默认)
跳过设置默认钥匙链的步骤,在代码签名命令中通过--keychain参数直接指定自定义钥匙链,绕开权限限制。
示例签名命令:
- name: 签名应用包 run: | KEYCHAIN_PATH="/Users/runner/Library/Keychains/my-build.keychain-db" # 签名应用 codesign --force --deep --sign "${{ secrets.DEVELOPER_ID_APP_NAME }}" --keychain $KEYCHAIN_PATH ./build/MyApp.app # 签名安装包 productbuild --component ./build/MyApp.app /Applications --sign "${{ secrets.DEVELOPER_ID_INSTALLER_NAME }}" --keychain $KEYCHAIN_PATH ./build/MyApp.pkg
注意事项
- 钥匙链密码、证书密码需存储在GitHub Secrets中,禁止硬编码在Workflow文件内
- 证书文件建议通过加密方式存储,或直接从Secrets中导出,避免明文泄露
- 确保导入证书时,通过
-T参数授权codesign、productbuild等工具访问证书,防止签名时出现权限拒绝
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

