Windows10上的GnuPG Git SSH身份验证和签名

介绍

Windows 10下需要用到Yubikey 5C NFC的OpenPGP协议,实现智能卡SSH登陆服务器,Gpg4win加密、解密、签名,以及git免密登陆、签名。

所需软件

创建或导入密钥

创建一个新的 GnuPG 密钥或导入现有的 GnuPG 密钥。必须确保密钥具有签名和身份验证子密钥!
列出现有密钥:

该密钥具有三个子密钥,一个用于 [A] 身份验证,一个用于 [S] 签名,一个用于 [E] 加密。我们需要[S]和[A]。

配置GnuPG

警告:不要使用 CRLF 换行符!必须切换到仅使用 LF!
C:\Users\当前用户名\AppData\Roaming\gnupg
目录下创建一个gpg.conf文件,添加以下内容:

use-agent

再创建一个gpg-agent.conf文件,添加以下内容:

enable-ssh-support
enable-putty-support

SSH控制文件

还有一个文件,C:\Users\当前用户名\AppData\Roaming\gnupg\sshcontrol, 该文件可能已存在于gnupg文件夹中。如果没有,创建它。
将身份验证子密钥(keygrip ID)添加到此文件中。末尾必须有一个换行符!必须使用 LF 行结尾,而不是 CRLF!否则密钥将无法被识别。

重新启动代理

gpg-connect-agent killagent /bye每次更改配置时,都必须使用和重新启动代理gpg-connect-agent /bye。

启动时启动代理

确保 gpg 代理在系统启动时启动。有多种方法可以做到这一点。最简单的解决方案是在C:\Users\当前用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup目录创建一个C:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe的快捷方式。修改快捷方式,使“Target”以/bye结尾,如:”C:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe” /bye。
/bye是一个必要的参数,以便命令启动代理后退出。

设置 wsl-ssh-pageant

默认情况下,Gpg4win 不能直接与 OpenSSH 一起使用。它可以与 Putty 配合使用,但如果想ssh从终端使用命令,或使用 Visual Studio Code 远程连接,则必须执行此步骤。
wsl-ssh-pageant-amd64-gui.exebenpye/wsl-ssh-pageant 版本下载。(它不是 GUI,它仅充当 GUI,因此不会看到终端窗口)。
此应用程序没有安装向导。只需创建一个文件夹C:\wsl-ssh-pageant并将wsl-ssh-pageant-amd64-gui.exe放入其中即可。位置并不重要。
C:\wsl-ssh-pageant\wsl-ssh-pageant-amd64-gui.exe接下来,创建内部的快捷方式
C:\Users\当前用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup。修改快捷方式,添加一些命令行参数,使“目标”如下所示:

C:\wsl-ssh-pageant\wsl-ssh-pageant-amd64-gui.exe –wsl C:\wsl-ssh-pageant\ssh-agent.sock –winssh ssh-pageant –systray
--wsl将创建一个套接字在 Windows 的Linux子系统内部使用。这--winssh将在主机 (Windows) 上为 OpenSSH 创建一个命名管道,需要添加环境变量SSH_AUTH_SOCK=\\.\pipe\ssh-pageant。

最后,双击该快捷方式。会在系统托盘中看到 wsl-ssh-pageant 的新图标。

检查SSH密钥

运行以下命令:

ssh-add -L

这将打印出 ssh 可以使用的所有可用密钥。您需要仔细检查打印的密钥之一是否确实来自 GnuPG。使用该gpg –export-ssh-key YOUR_KEY_ID命令从 GPG 打印 ssh 密钥的公共部分。这YOUR_KEY_ID是密钥的 ID,而不是子密钥的 ID!下面的例子。

如果与ssh-add -L结果匹配,那么 OpenSSH 一切正常!

与 GitHub 一起使用(身份验证)

转到https://github.com/settings/keys并添加导出的 ssh密钥(密钥来自 gpg –export-ssh-key)。
最后,通过使用用户身份ssh -T git@github.com连接来测试它。

与 GitHub 一起使用(签名)

首先,以长格式列出 GnuPG 密钥:

接下来,以可读格式导出 [S]igning 密钥。

复制输出,包括—–BEGIN …直到最后。转到https://github.com/settings/keys并添加此公共GnuPG密钥。
最后,设置Git有关签名密钥的信息。使用S密钥的 ID。
git config --global user.signingkey E986FF17F89EA0FE
配置 git 自动签名提交。
git config --global commit.gpgsign true

与适用于 Windows 的 Linux 子系统一起使用

所要做的就是添加export SSH_AUTH_SOCK=/mnt/c/wsl-ssh-pageant/ssh-agent.sock到wsl的~/.bashrc文件中。只要wsl-ssh-pageant正在运行,就可以使用此套接字。
运行ssh-add -L将打印出与主机 Windows 上相同的 SSH 密钥。