跳到内容
Triwarden

指南 · SSH 代理

你的 SSH 密钥,
放在保险库里。

Triwarden 使用保险库中的 SSH 密钥,为 ssh 和 git 提供代理服务。签名在 App 内完成,客户端获取签名,不会获取私钥;批准频率可自行设置。

ssh · git代理 socketTriwarden你批准签名
ssh 请求签名。Triwarden 检查批准状态,必要时要求 Touch ID 或 Mac 密码,完成后返回签名。

设置

四个步骤,
设置 SSH 代理。

  1. 01

    打开代理

    打开 Triwarden › 设置 › 开发者,开启 使用 Triwarden 作为 SSH 代理。App 开着时它就会运行,并且只在保险库解锁时提供密钥。

    Triwarden Settings › Developer: Use Triwarden as SSH agent, Ask before signing, and SSH setup with Copy buttonsTriwarden Settings › Developer: Use Triwarden as SSH agent, Ask before signing, and SSH setup with Copy buttons
  2. 02

    添加密钥

    新建一个 SSH 密钥项目。按 生成 Ed25519 密钥创建新的,或粘贴你已有的私钥 — 未加密的 OpenSSH 密钥(-----BEGIN OPENSSH PRIVATE KEY-----)。Ed25519、ECDSA(P-256、P-384、P-521)和 RSA 都支持,其他 Bitwarden App 保存的 SSH 密钥也会出现。

    密钥有密码短语?代理无法使用加密的密钥。先做一份未加密的副本,粘贴进项目后删除副本 — 之后由保险库替它加密。

    New SSH Key in the detail panel: name, folder, private key with Generate Ed25519 Key, public key and fingerprintNew SSH Key in the detail panel: name, folder, private key with Generate Ed25519 Key, public key and fingerprint
    Remove a passphrase (on a copy)
    cp ~/.ssh/id_ed25519 /tmp/key
    ssh-keygen -p -N "" -f /tmp/key
    # paste /tmp/key into the item, then:
    rm /tmp/key
    
  3. 03

    让 ssh 找到它

    把代理添加到 ~/.ssh/config — 设置 › 开发者 › SSH 设置里有个复制按钮,路径已帮你填好。也可以只对单个 Shell 设置。

    建议用配置文件:从 Dock 打开的 App(VS Code、Tower、Fork、Xcode)读不到 Shell 的变量,但每个 ssh 都会读配置文件。

    ~/.ssh/config
    Host *
      IdentityAgent "~/Library/Group Containers/…/agent.sock"
    
    zsh
    export SSH_AUTH_SOCK="$HOME/Library/Group Containers/…/agent.sock"
    
  4. 04

    确认可以用

    ssh-add -L 会列出代理提供的公钥。什么都没有?请看下方的解决办法。

    Terminal
    ssh-add -L
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKx…Qx9 GitHub
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM2…7mK homelab
    

日常使用

所有用到 ssh
的地方。

GitHub 和 GitLab

把项目的公钥粘贴到 GitHub › Settings › SSH and GPG keys,类型选 Authentication key(GitLab:User settings › SSH keys)。然后测试:

Terminal
ssh -T [email protected]
# Triwarden asks: allow “ssh” to sign with “GitHub”
Hi alexchen! You've successfully authenticated, but GitHub does not provide shell access.

你的服务器

把公钥加入服务器的 ~/.ssh/authorized_keys,再用 ssh 连接。Triwarden 代理返回签名,不会把私钥发送给 ssh。

Terminal
ssh [email protected] 'cat >> ~/.ssh/authorized_keys' < homelab.pub
ssh [email protected]

签名的 git 提交

在密钥页面上,Git 签名 › 复制设置会给你这三行。把同一个公钥添加到 GitHub 作为 Signing key,你的提交就会显示 Verified。

Git signing › Copy Setup
git config --global gpg.format ssh
git config --global user.signingkey "key::ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKx…Qx9 GitHub"
git config --global commit.gpgsign true

也想在本地验证签名,就列出你信任的密钥:

Terminal
echo "[email protected] ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKx…Qx9" >> ~/.ssh/allowed_signers
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
git log --show-signature -1
Good "git" signature for [email protected] with ED25519 key SHA256:…

多个密钥

密钥很多时,服务器可能在试到正确的那个之前就报“Too many authentication failures”。把那个密钥的公钥部分存成文件,并指定给该主机:

~/.ssh/config
Host github.com
  IdentityFile ~/.ssh/github.pub
  IdentitiesOnly yes

只用于部分主机

其他主机想继续用别的代理?只让指定的主机使用 Triwarden:

~/.ssh/config
Host github.com gitlab.com nas.home.arpa
  IdentityAgent "~/Library/Group Containers/…/agent.sock"

Git App 和编辑器

VS Code、Tower、Fork、Xcode 以及任何使用系统 ssh 的 App 都会读 ~/.ssh/config,完成第 3 步后就能用,批准提示也一样会出现。

批准

由你决定,
何时批准签名。

每个请求都会写明程序和密钥 —“允许 ssh 用 SSH 密钥 GitHub 签名”。在 设置 › 开发者 › 签名前询问 选择多久问一次:

每次
默认:每次签名都会询问
每个 App 每分钟一次
适合连续几次 git fetch
每个 App 每 10 分钟一次
适合长时间工作;锁定后就会忘记

Touch ID 无法使用时,macOS 可改用 Mac 密码批准。选择拒绝即可拒绝请求。“设置 › 开发者”会列出最近的批准和拒绝记录。

解决办法

如果它
不能用。

“The agent has no identities.”

保险库已锁定、代理没开、没有 SSH 密钥项目,或项目里的密钥有密码短语(加密的密钥不会被提供)。

“Could not open a connection to your authentication agent”

这个 Shell 不知道代理在哪。把 IdentityAgent 那行添加到 ~/.ssh/config,或在该 Shell 运行第 3 步的 export。

“agent refused operation”

请求被拒绝,或提示放着直到超时。重新运行命令并批准即可。

“Too many authentication failures”

服务器在试到正确的密钥前就放弃了。把密钥指定给该主机(见上方“多个密钥”)。

随时可以开始。

个人免费使用也包含 SSH 代理。工作用途需购买授权。

下载 Mac 版