koto's Site # 😜 Knowing me Shorts Search Posts Tags Dates Friends Settings

用 SSH 密钥签名 Git (feat. Systemd --user)

使用 Systemd User Units 管理 ssh-agent 和 ssh-add, 并用 SSH 密钥签名 Git.

2025-09-14 06:50:00 (UTC) 1 min 49 s

Tagged with:

思路

  • 用 Systemd User Units 管理 ssh-agent 和 ssh-add, 从而管理 ssh 身份
  • 配置 Git 使其默认使用某个 Key Pair 签名

让 Systemd 管理 ssh 身份

  1. 创建一个 ssh-agent.service 来启动 ssh-agent

    ~/.config/systemd/user/ssh-agent.service
    [Unit]
    Description=SSH key agent
    [Service]
    Type=simple
    Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
    ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK
    Restart=on-failure
    RestartSec=5s
    [Install]
    WantedBy=default.target
  2. 创建 ssh-add.service 来添加身份

    ~/.config/systemd/user/ssh-add.service
    [Unit]
    Description=Add SSH keys to agent
    After=ssh-agent.service
    Wants=ssh-agent.service
    [Service]
    Type=oneshot
    Environment=SSH_ASKPASS=/usr/bin/ksshaskpass
    Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
    ExecStart=/usr/bin/ssh-add <可指定你的 Private Key 目录, 可以用 %h 代表家目录, 也可以缺省来加载所有>
    ExecStartPost=/usr/bin/ssh-add -l > /dev/null
    [Install]
    WantedBy=default.target
  3. 添加对应环境变量

    创建 ~/.config/environment.d/ssh-agent.conf

    ~/.config/environment.d/ssh-agent.conf
    SSH_AUTH_SOCK=/run/user/<更改为你的 User ID>/ssh-agent.socket
  4. 启动这些 Units

    Terminal window
    systemctl --user daemon-reload
    systemctl --user enable --now ssh-agent.service
    systemctl --user enable --now ssh-add.service

告诉 Plasma 默认使用 ksshaskpass 作为 SSH_ASKPASS

创建一个 ~/.config/plasma-workspace/env/ssh-askpass.sh, 写入对应环境变量.

~/.config/plasma-workspace/env/ssh-askpass.sh
#!/bin/bash
export SSH_ASKPASS=/usr/bin/ksshaskpass

请登出并重新登入 Plasma, 这样才能对用户应用这些环境变量.

全局配置 Git 使用特定 Key Pair 签名

Terminal window
# 开启签名
git config --global commit.gpgsign true
# 配置签名类型为 SSH
git config --global gpg.format ssh
# 配置签名密钥
git config --global user.signingkey <密钥路径>
# 配置已允许的签名身份
git config --global gpg.ssh.allowedSignersFile ~/.git-allowed-signers
echo "<你 SSH Key Pair 设定的 Email> <.pub 文件内 ssh-xxx xxxxx>" >> ~/.git-allowed-signers

验证

  • 在你登入时 ksshaskpass 应该会向你询问 SSH Key Pair 的 passphrase
  • 打开需要使用这些身份的应用时 kwallet 应该会向你询问是否允许
  • 可以使用 ssh-add -l 查看已被加载的 SSH 身份
# 用 SSH 密钥签名 Git (feat. Systemd --user)