如何在Mac命令行脚本中授权codesign信任导入的钥匙串
解决Mac构建脚本中codesign钥匙串授权问题
问题背景
我正在为产品创建可在任意Mac上运行的标准化构建脚本,已将所有分发证书导出为p12文件存储在仓库中,并使用以下命令导入钥匙串:
echo "Attaching External Keychain" /usr/bin/openssl pkcs12 -in Distribution-Keys.p12 -nokeys -passin pass:<PASSWORD> | /usr/bin/openssl x509 -noout -fingerprint -subject -dates -nameopt utf8,sep_semi_plus_space echo "Creating external Keychain" security create-keychain -p <PASSWORD> Distribution-Keys.keychain echo "Changing access to external Keychain" security set-keychain-settings -lut 21600 Distribution-Keys.keychain echo "Unlocking external Keychain" security unlock-keychain -p <PASSWORD> Distribution-Keys.keychain echo "Importing external Keychain from p12 file" security import Distribution-Keys.p12 -P <PASSWORD> -A -t cert -f pkcs12 -k Distribution-Keys.keychain security list-keychain -d user echo "Adding new keychain to search path" security list-keychain -d user -s Distribution-Keys.keychain /Users/support/Library/Keychains/login.keychain-db security list-keychain -d user
但遇到两个问题:
- 本地终端运行脚本时,会弹出窗口要求输入密码以允许
codesign访问钥匙串中的'Distribution-Keys'密钥 - 通过SSH运行脚本时,出现“codesign退出码3”错误
需要通过命令行在脚本中完成信任授权,避免弹窗和报错。
命令行授权解决方案
1. 设置钥匙串分区权限(核心步骤)
导入证书后,必须给codesign等工具授予访问密钥的权限,直接运行以下命令:
# 给钥匙串中的密钥添加codesign等工具的访问权限 security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k <PASSWORD> Distribution-Keys.keychain
说明:
-S指定允许访问的服务范围,覆盖Xcode工具和签名工具;-s表示针对密钥设置权限;-k后跟你的钥匙串密码。
2. 配置证书信任级别
确保分发证书被系统信任,避免签名时验证失败:
# 从p12文件中提取证书并添加为信任根证书 security add-trusted-cert -d -r trustRoot -k Distribution-Keys.keychain <(openssl x509 -in Distribution-Keys.p12 -nokeys -passin pass:<PASSWORD>)
3. SSH环境适配
SSH会话中需要确保钥匙串始终处于解锁状态,在脚本开头或签名操作前添加:
# 强制解锁钥匙串(避免SSH会话中钥匙串锁定) security unlock-keychain -p <PASSWORD> Distribution-Keys.keychain # 确保钥匙串在搜索路径首位 security list-keychain -d user -s Distribution-Keys.keychain /Users/support/Library/Keychains/login.keychain-db
整合到原脚本
把上述授权命令添加到原脚本的security import步骤之后,完整的补充部分如下:
# ...原脚本中导入证书的命令... echo "Granting codesign access to keychain keys" security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k <PASSWORD> Distribution-Keys.keychain echo "Marking distribution certificate as trusted" security add-trusted-cert -d -r trustRoot -k Distribution-Keys.keychain <(openssl x509 -in Distribution-Keys.p12 -nokeys -passin pass:<PASSWORD>) # ...后续脚本步骤...
内容的提问来源于stack exchange,提问作者canderse
相关产品推荐
相关产品推荐

