Git 将 HTTP(S) 身份验证委托给凭据助手。SSH 远程仓库改用 SSH 密钥和代理,因此 credential.helper 不会管理它们的私钥。
选择凭据助手 #
列出已配置的助手以及设置它们的配置文件:
git config --show-origin --get-all credential.helper
git help -a | grep credential-Git 按配置顺序请求助手填充缺失的凭据字段。助手可以拒绝请求或返回部分数据,之后 Git 可能查询另一个助手或提示用户。
| 助手 | 存储 | 适用场景 |
|---|---|---|
cache | 本地守护进程中的内存 | 短期开发会话 |
store | 明文 ~/.git-credentials | 仅在接受明文存储风险时使用 |
osxkeychain | macOS 钥匙串 | macOS 开发 |
| Git Credential Manager | 平台安全存储和浏览器登录 | 受支持的桌面平台 |
例如,使用有时限的内存缓存:
git config --global credential.helper 'cache --timeout=3600'相较于 store,优先使用平台钥匙串或 Git Credential Manager。本地仓库可以通过省略 --global 覆盖全局助手。
作用域令牌和用户名 #
除非启用路径匹配,否则 Git 会根据协议和主机匹配凭据。当不同仓库使用不同账户或令牌时,应包含 HTTP 路径:
git config --global credential.useHttpPath true凭据段可以预填用户名而不存储秘密:
[credential "https://github.com"]
username = octo不要将令牌嵌入远程 URL。Git 配置、进程参数、终端历史记录、调试输出和复制的日志都可能暴露此类 URL。
安全使用 GitHub 令牌 #
GitHub 在 2021 年移除了 Git 通过 HTTPS 进行的密码身份验证。请在密码提示中输入个人访问令牌,或允许凭据助手或 Git Credential Manager 提供令牌。
细粒度令牌将访问限制到选定资源和权限。当其资源模型涵盖所需操作时,应选择细粒度令牌。对于需要细粒度令牌不具备的权限的集成,仍然需要经典令牌。无论使用哪种令牌:
- 授予最小的仓库和权限作用域;
- 设置过期日期;
- 将值保存在操作系统钥匙串、秘密管理器或 CI 秘密存储中;
- 如果令牌暴露在日志或 shell 历史记录中,立即撤销并替换它。
SSH 不使用 HTTP 凭据助手。如果出站端口 22 被阻止,托管服务商可能支持通过 443 端口使用 SSH;只有在核实服务商发布的说明和主机密钥指纹后,才配置该端点。
控制交互式提示 #
当助手无法提供凭据时,Git 会依次检查 GIT_ASKPASS、core.askPass 和 SSH_ASKPASS。选定的程序接收提示作为参数,并将答案写入标准输出。没有合适的 askpass 程序时,Git 会在控制终端上提示。
自动化应从 CI 秘密存储接收短期、有作用域限制的令牌。当非交互式任务必须失败而不是因等待提示而挂起时,设置 GIT_TERMINAL_PROMPT=0:
GIT_TERMINAL_PROMPT=0 git fetch origin绝不要将令牌放入仓库、Docker 镜像层、测试夹具,或放入进程列表可以显示的命令行中。
检查、拒绝和轮换凭据 #
git credential 是与已配置助手通信的底层命令,使用由空行分隔的键值记录:
printf 'protocol=https\nhost=example.com\n\n' | git credential fill
printf 'protocol=https\nhost=example.com\nusername=octo\n\n' |
git credential rejectfill 请求凭据,approve 要求助手保存凭据,reject 要求助手删除被拒绝的凭据。助手控制具体的存储和删除行为。钥匙串应用还提供了检查和删除条目的图形方式。
撤销或轮换令牌后,在重试操作前删除旧的助手条目。否则 Git 可能继续提交过时凭据,从而掩盖成功的替换。
评论
在 GitHub 上阅读或评论(发表评论需要登录)