在 VS Code Remote SSH 中完美配置 GPG 自动签名 (macOS 到 Ubuntu 24.04)

在使用 VS Code Remote SSH 进行远程开发时,安全且优雅地处理 Git 提交签名一直是个痛点。

如果你在本地 macOS 上拥有 GPG 私钥,直接将私钥复制到远程 Ubuntu 服务器不仅麻烦,还会带来极大的安全隐患。最完美的解决方案是:将私钥安全地留在 macOS 上,通过 SSH Socket 转发,让远程的 Git 直接调用本地的 GPG Agent 进行签名。

这篇教程将手把手教你如何打通 macOS (Local) 到 Ubuntu 24.04 (Remote) 的 GPG 转发,实现无缝的 Git 自动签名体验。


核心原理

在远程执行 git commit 时,远程服务器的 GPG 会尝试寻找本地的 Socket。我们通过 SSH 的 RemoteForward 功能,将远程机器上的 GPG Socket 映射到我们 macOS 上的 extra-socket。这样,当需要输入密码时,你的 Mac 上会自动弹出一个密码输入框,安全又便捷。


步骤 1:配置本地 Mac 环境

为了让 Mac 能在后台(被远程触发时)弹出密码输入框,我们需要安装一个 GUI 提示工具 pinentry-mac

  1. 使用 Homebrew 安装 pinentry-mac:

    Bash

    复制代码
    brew install pinentry-mac
  2. 配置本地 GPG 使用该工具:

    打开或创建 ~/.gnupg/gpg-agent.conf 文件,并添加以下内容(注意:如果是 Apple Silicon (M1/M2/M3) 芯片,路径通常为 /opt/homebrew/bin/pinentry-mac;如果是 Intel 芯片,路径可能是 /usr/local/bin/pinentry-mac):

    Plaintext

    bash 复制代码
    pinentry-program /opt/homebrew/bin/pinentry-mac
  3. 重启本地 GPG Agent 使配置生效:

    Bash

    bash 复制代码
    gpgconf --kill gpg-agent
  4. 获取本地 extra socket 路径(请复制备用):

    运行以下命令,你会得到一个类似 /Users/yourname/.gnupg/S.gpg-agent.extra 的路径:

    Bash

    css 复制代码
    gpgconf --list-dirs agent-extra-socket

步骤 2:配置远程 Ubuntu (24.04) 环境

如果不配置 SSH 服务端,每次断开重连时,SSH 都会因为无法覆盖旧的 Socket 文件而导致转发失败。我们需要修改 Ubuntu 的 SSHD 配置。

  1. SSH 登录到你的 Ubuntu 服务器。

  2. 编辑 SSH Daemon 配置文件:

    Bash

    bash 复制代码
    sudo nano /etc/ssh/sshd_config
  3. 开启 Socket 覆盖:

    在文件中找到或直接添加以下这一行:

    Plaintext

    bash 复制代码
    StreamLocalBindUnlink yes
  4. 重启远程 SSH 服务:

    Bash

    复制代码
    sudo systemctl restart ssh
  5. 获取远程 socket 路径(请复制备用):

    在 Ubuntu 上运行以下命令,你会得到一个类似 /run/user/1000/gnupg/S.gpg-agent 的路径:

    Bash

    css 复制代码
    gpgconf --list-dirs agent-socket

步骤 3:配置本地 SSH 转发 (macOS)

现在,我们要把第一步和第二步拿到的 Socket 路径连接起来。

  1. 在 Mac 上打开你的 SSH 配置文件:~/.ssh/config

  2. 找到你用于连接 Ubuntu 的 Host 配置块,添加 RemoteForward。格式为 RemoteForward <远程路径> <本地 extra 路径>

    代码段

    bash 复制代码
    Host my-ubuntu-remote
        HostName 192.168.1.100 # 你的服务器 IP 或域名
        User ubuntu
        # 核心配置:将远程的请求转发到本地 Mac
        RemoteForward /run/user/1000/gnupg/S.gpg-agent /Users/yourname/.gnupg/S.gpg-agent.extra

步骤 4:在远程机器上配置 Git

最后一步,告诉远程的 Git 使用你的 GPG Key 进行签名。

  1. 在 Mac 上查询你的 Key ID:

    Bash

    css 复制代码
    gpg --list-secret-keys --keyid-format=long

    (找到 rsa4096/ed25519/ 后面的那一串字符,比如 3AA5C34371567BD2)

  2. 在 Ubuntu 服务器上配置 Git 全局变量:

    Bash

    lua 复制代码
    git config --global user.signingkey <你的_KEY_ID>
    git config --global commit.gpgsign true

步骤 5:见证奇迹的时刻 (测试)

配置完成后,请彻底关闭 VS Code 以及所有连向该服务器的 SSH 终端,然后重新打开 VS Code 并连接到该远程工作区。

打开 VS Code 的集成终端,输入以下命令测试通信是否畅通:

Bash

bash 复制代码
echo "test" | gpg --clearsign

如果配置成功: 你的 Mac 屏幕上会立刻弹出一个精美的 GUI 窗口,要求你输入 GPG 私钥密码。输入正确的密码后,VS Code 终端内将输出一段带有完整 PGP 签名的文本。

🎉 恭喜!现在你在 VS Code 远程环境中执行的所有 Git Commit 都将自动带有你的安全签名了。

相关推荐
笑鸿的学习笔记1 天前
git笔记之已push到远程,想把最新的两个commit合并为一个commit, 使用reword和fixup
笔记·git
徐健峰1 天前
Claude Code 安装完全指南(Mac 版):Git、环境变量、PATH 与常见报错一次讲清(2026)
git·macos·arcgis
sunriver20001 天前
【Git】TortoiseGit无法push远程仓库
git·tortoisegit
REDcker2 天前
Git分支可视化管理面板设计与选型
git
Chan162 天前
MCP 开发实战:Git 信息查询 MCP 服务开发
java·开发语言·spring boot·git·spring·java-ee·intellij-idea
yanlaifan2 天前
恢复git硬删除的commit
git
学渣y2 天前
git分布式版本控制系统
分布式·git·elasticsearch
时空无限2 天前
git 文件冲突之后如何操作
git
Jul1en_2 天前
【Git】利用 LFS 突破 GitHub 大文件上传限制
git·github
云巅的cat2 天前
Git 使用指南
git·github