在 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 都将自动带有你的安全签名了。

相关推荐
一直C18 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
轮到我狗叫了1 天前
git - 版本控制工具 - 对应的常见命令 - 以及无需后续每次手动source conda
git
changxiang1 天前
GIT 备忘
git
DogDaoDao1 天前
Windows 开发提效工具全景指南:60+ 工具的工程化分层配置
windows·git·程序员·开发工具·powershell·everything·msys2
wdfk_prog2 天前
GitHub push 失败:如何扫描并清理 Git 历史中的大文件
git·elasticsearch·github
大明二代2 天前
使用 Traefik、cert-manager 和 DNS-01 为内网 Kubernetes 服务配置 HTTPS
git·kubernetes·flux
小芒果_012 天前
git常用命令速查
大数据·git·elasticsearch
2501_930472442 天前
腾讯云助手规范化Git提交记录
git·elasticsearch·腾讯云
风尘小子2 天前
git的.gitignore文件中文件和目录配置
git
Tanner_SL3 天前
Linux笔记之GIT常用命令
linux·git