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