VSCode Git 使用 GPG

时间:2023-01-17 14:53:47

1. GPG 安装

Linux 包管理器安装即可,Windows 可在如下链接下载。 下载链接: www.gnupg.org
Windows 下推荐:https://gpg4win.org/download.html

2. GPG 使用

# gpg --full-generate-key
gpg --gen-key # 生成密钥(公钥和私钥),按照流程提示进行
gpg --list-keys # 列出当前所有的密钥,检查刚才的密钥是否生成成功
# 列表的一个长字符串即<USER_ID_HASH>

可以通过--output来导出密钥到文件,--armor选项以ASCII码的格式导出。

# 导出
gpg --output <YOUR_KEY_FILE_NAME>-pub.key --armor --export <USER_ID_HASH>
gpg --output <YOUR_KEY_FILE_NAME>-sec.key --armor --export-secret-key <USER_ID_HASH>

# 导入
gpg --import <YOUR_KEY_FILE_NAME>-pub.key
gpg --allow-secret-key-import --import <YOUR_KEY_FILE_NAME>-sec.key

# 加密
gpg --encrypt -armor -r key-id filename

# 解密
gpg --output 新文件名 --decrypt 加密文件名

# 修改密钥
gpg --edit-key 标识名

# 删除密钥
gpg --delete-secret-keys 标识名

# 删除公钥
gpg --delete-keys 标识名

3. Git 启用 GPG

git config --global user.signingkey <USER_ID_HASH>
git config --global commit.gpgsign true

bash 环境将 export GPG_TTY=$(tty) 加入到 ~/.bash_profile

Windows 可能还要配置 GPG 程序路径:

git config --global gpg.program "D:\Program Files (x86)\GnuPG\bin\gpg.exe"

设置 gpg-agent.conf 延长 gpg 密钥缓存时间,内容设置为:

default-cache-ttl 86400
max-cache-ttl 604800
# wsl2 下生效,wsl 中请注释以下行
pinentry-program "/mnt/d/Program Files (x86)/Gpg4win/bin/pinentry.exe"

设置后可能需要通过运行以下命令重新启动 GPG 代理: gpg-connect-agent reloadagent /bye

其中Linux / macOS 路径为:~/.gnupg/gpg-agent.conf,Windows (使用 gpg --version 确认使用的路径),一般为:

%AppData%\gnupg\gpg-agent.conf
%userprofile%\.gnupg\gpg-agent.conf

Wsl 的 Linux 下可用方案为 ~/.bashrc 下弄 2 个函数,用于缓存密钥密码:

gpg-login() {
    export GPG_TTY=$TTY
    # 对 "test" 这个字符串进行 gpg 签名,这时候需要输密码。
    # 然后密码就会被缓存,下次就不用输密码了。
    # 重定向输出到 null,就不会显示到终端中。
    echo "test" | gpg --clearsign > /dev/null 2>&1
}

gpg-logout() {
    echo RELOADAGENT | gpg-connect-agent
}

VSCode 配置加上:

"git.enableCommitSigning": true,

4. Git 服务器添加公钥

将上面生成的公钥<YOUR_KEY_FILE_NAME>-pub.key内容添加至 Git 服务器。

参考资料: [1] https://blog.miniasp.com/post/2020/09/21/Keep-GnuPG-credentials-cached-for-entire-day [2] https://*.com/questions/63440623/no-gpg-passphrase-prompt-in-visual-studio-code-on-windows-10-for-signed-git-comm