管理 macOS 钥匙串、证书与密码项,并为代码签名准备身份。
macOS 把密码、证书和私钥存放在钥匙串中:登录钥匙串随用户登录解锁,系统钥匙串保存系统级凭据,CI 常另建专用钥匙串。security 可以列出钥匙串、查找签名身份、增删通用密码项、导入导出证书,以及解锁和设置钥匙串权限。
边界:security 只是钥匙串工具,不会替你签发证书。代码签名和 Gatekeeper 的前提是:钥匙串里有有效的 Developer ID 证书及其私钥,codesign 能用该身份签名,产物经过公证并 stapled,最后 spctl 评估通过。iCloud 钥匙串同步的网站密码由系统管理,security 通常读不到,或需要交互授权。
影响范围:
find-generic-password -w会把密码明文输出到终端、日志和 shell 捕获;add-generic-password -w 明文会进入进程参数和命令历史;set-key-partition-list会扩大哪些程序可以无提示访问私钥;删除或重建钥匙串会连同私钥和密码项一起丢失,且没有回收站。前置条件:先确认操作的是哪个钥匙串,导出备份并限制终端日志;CI 使用专用钥匙串和受保护变量,不要在共享机器上操作登录钥匙串。恢复方式:用security export/import恢复备份,用unlock-keychain解锁,必要时在钥匙串访问中重新导入证书和私钥;删除前先确认没有可恢复的备份。
# 1. 查看当前用户的钥匙串搜索列表
% security list-keychains -d user
# 2. 列出可用于代码签名的有效身份;为空说明证书、私钥或信任链有问题
% security find-identity -v -p codesigning
# 3. 从登录钥匙串读取一个密码项;-w 会把明文打到 stdout,注意日志
% security find-generic-password -s deploy-token -w
# 4. 新增或更新密码项;把 -w 放在最后且不跟值时会提示输入,避免密码进命令历史
% security add-generic-password -a "$USER" -s deploy-token -U -w
# 5. CI 中解锁专用钥匙串,并设置搜索列表
% security unlock-keychain -p "$KEYCHAIN_PW" build.keychain
% security list-keychains -d user -s login.keychain build.keychain
# 6. 允许 codesign 非交互访问私钥,避免弹窗卡住流水线
% security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PW" build.keychain
find-identity -v -p codesigning 返回 0 个身份:证书过期、私钥不在钥匙串、信任链不完整,或钥匙串没加入搜索列表;先看 security find-certificate 和钥匙串访问。errSecInternalComponent 或弹出钥匙串密码框;先 security unlock-keychain,CI 用专用钥匙串。set-key-partition-list,或导入时没加 -T /usr/bin/codesign;用 -A 导入会让所有应用无提示访问私钥(不安全),只应在隔离的 CI 钥匙串使用。find-generic-password -w 会把密码明文写到 stdout,命令行里的 -p 密码 又会出现在进程参数和 shell 历史中;CI 用受保护变量并限制日志。security export 备份,再操作。security 配置正确也不等于应用能通过首次启动检查。codesign — 用钥匙串中的身份签名并校验。csrutil — 系统完整性保护与签名信任的边界。sudo — 系统钥匙串和特权操作。launchctl — 让签名服务在登录后运行。openssl — 对照证书与私钥操作。合上页面,先回答,再展开对照。
security find-identity -v -p codesigning 为空,可能是哪些环节出了问题?set-key-partition-list?不做会怎样?errSecInternalComponent。
小程序版
微信扫码,随时查命令