安全

凭据助手

Gitcito 手里握着三种不同的机密,而人们很自然地以为它们是同一样东西:

由谁保管
托管方 API 令牌——拉取请求(PR)、议题、CI 检查 Gitcito,存在你的操作系统钥匙串里
git@… 传输 你的 SSH 密钥,经由系统的 ssh agent
https:// 传输 git 自己的凭据助手

第三种在出问题之前谁也不觉得它算个功能,而一旦出问题,它就制造出 git 里最常见的两句 抱怨:它怎么又问我一遍? 和 它怎么还在发我已经撤销掉的那个令牌?

⌘K → 凭据助手。

已配置的助手、按主机的规则,以及明文文件警告

你看到的是什么

每一条已配置的 credential.helper,连同它所在的作用域——system、global,然后是 本仓库。助手是叠加的:git 会依次询问每一个,仓库级的那条并不会替换掉全局的那条。

每一条都会对照你的机器做检查:

标记 含义
就绪 助手程序存在,能够运行
未安装 配置了,但程序不在——于是每次提示都退化成再手敲一遍密码
密码存在明文文件里 store 助手(见下文)

针对特定主机的规则列出的是 credential.<url>.* 小节。对它们匹配的 URL 而言, 这些规则压过普通设置,通常也就是「为什么偏偏这一个主机行为不一样」的答案。

选一个

助手 密码存到哪里
osxkeychain macOS 钥匙串——加密,按用户隔离
manager Git Credential Manager(Windows,跨平台)
wincred Windows 凭据管理器
libsecret Linux 的 secret service(GNOME Keyring、KWallet)
cache 内存,保留 15 分钟。磁盘上什么都不留
store 你主目录里的一个纯文本文件。未加密

Gitcito 只提供这台机器上确实装了的那些,标出与你的操作系统相配的那个,其余的置灰。

作用域很重要。 对所有仓库会写进你的全局配置,这几乎总是你想要的;仅对本仓库 是留给那种要向别的东西做认证的特殊仓库的。

store 助手与 ~/.git-credentials

store 会把 https://user:password@host 这样的行写进 ~/.git-credentials,纯文本, 没有任何形式的加密。任何以你的身份运行的东西都能读它:一个脚本、某个依赖的 postinstall,什么都行。

如果那个文件存在,本页会告诉你,并数出里面有多少条。它永远不会把内容显示出来——计数 本身就是重点,为了展示而去读内容会犯同一个错误。

如果你发现了一个,而这并非你本意:在这里挑一个真正的助手,然后删掉那个文件,重新认证 一次。

忘掉一条已存的凭据

当一个令牌被撤销或轮换之后,助手还在一遍遍递上旧的那个,于是每次推送都失败于一个什么 都没说清的 401。忘记会请求已配置的助手抹掉它为该主机保存的条目——也就是 git credential reject,git 自己文档里给出的路子。

这条路上什么都不会被读取:Gitcito 从不调用 git credential fill,那条命令会把一个 有效的密码打印到标准输出。

下一次推送会问你一次,然后助手把新答案存起来。

值得知道的限制

  • 这是 git 的存储,不是 Gitcito 的。 改动它也会改变你终端里的行为——这正是重点, 但在动手之前值得知道。
  • 系统级的助手只展示,不可编辑。 它们待在只有管理员才能写的配置里。
  • Gitcito 无法列出一个助手都存了些什么。 没有哪个凭据 API 能在不交出机密的前提下 做到这一点,所以这个对话框只报告配置、并按你的要求执行擦除,别的什么都不做。
  • 你交给 Gitcito 的令牌是另一回事。 撤销其中一个并不会碰到另一个;钥匙串那一侧 见安全。

另请参阅:安全 · SSH 密钥 · 同步

在 GitHub 上改进这份翻译