系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

security

管理 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

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. security find-identity -v -p codesigning 为空,可能是哪些环节出了问题?
  2. CI 中签名为什么需要 set-key-partition-list?不做会怎样?
  3. 签名身份配置正确,应用为什么仍可能被 Gatekeeper 拦截?
答案
  1. 证书过期或被吊销、私钥缺失、信任链不完整,或钥匙串未加入搜索列表。
  2. 它把私钥加入 codesign 可访问的分区列表,避免每次签名弹窗或直接失败;不做会导致流水线卡住或 errSecInternalComponent。
  3. Gatekeeper 还要求使用 Developer ID 签名、启用硬化运行时、完成公证并 stapling;仅有证书和签名不够。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令