OpenPGP应用示例

使用OpenPGP进行SSH验证

在Windows中使用MeXkey3的OpenPGP进行SSH验证

在Linux中使用MeXkey3的OpenPGP进行SSH验证

在WSL2中使用MeXkey3的OpenPGP进行SSH验证

在Windows中使用MeXkey3的OpenPGP进行SSH验证

环境说明
  • 操作系统:Windows11

查看密钥

输入命令gpg -k --keyid-format short --fingerprint --with-keygrip查看密钥

找到[AR]标识的密钥,并记下Keygrip与keyID

PS C:\Users\linhu> gpg -k --keyid-format short --fingerprint --with-keygrip
[keyboxd]
---------
pub   rsa4096/67593603 2024-04-02 [SC]
      Key fingerprint = 0DD2 20B4 4255 5A4A 8A08  A1F4 72E3 9100 6759 3603
      Keygrip = 96111D8C38A28F0058DC0B1DE016336B7B76FBAA
uid         [ultimate] Metoo <linhui62@live.com>
sub   rsa4096/A04407D2 2024-04-02 [E]
      Keygrip = 0765BC114A6BA09BA2B6EB42412A7567D9A88534
sub   rsa4096/E96FF207 2024-04-02 [S]
      Keygrip = 6727D76635C2AE60C1CACE2D6BCD309C51CC020A
sub   rsa4096/11C9F011 2024-04-02 [AR]
      Keygrip = 07F027D3697B4F26B88FE42C081C52FE51FF3328B88FE42C081C52FE51FF3328

导出SSH格式公钥

使用命令gpg --export-ssh-key 11C9F011输出SSH格式公钥

PS C:\Users\linhu> gpg --export-ssh-key 11C9F011
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqo+pBue94VZovQKrZ/3fVNGgvVbwLlbuTutNfK29juKE3eWuPv+n3RIELvtASrWua+1MLS1Up+g2soOjgozh85qvAxm1SWCFUkwvNdpgiydXH5G4xYwfdKMWzE7hKlblpMcKIGp/56AzNMoNIQr1hwocPIwT6E73gtWzSz4LRM6bKcwXrppVNbUeU8nYnMWSeaEHmMy5gnQKAXZfJALybW/Ir0iX7Q7mZGVBYUejY0tslqMyEaGOSLymeCNsFk3xIDp002DSj34C0HZXGKQdsYOa5PkyTC4JFcZ7CtV2zhQX2y7+9EHP73cY0kxNRinML2lE/6PpFhF5LqwhSqsW33QoU9cYiu4k2YvBGoRRgREYlZJZPZEF0XRmun0ZlhoYCbrgZpUum+9xMYXdBs67KszGwYqCERRn64Js+uBLTUqVbvCv8koOqjmcAWp6CAMwhZNbg05DRAzFpUBUb4GG156bKwOe28RS/pYNzm/RdjB2S3l/FHxECnfvAR6KLZDAkOhRTxEE8/PRag0INgx+7ifKiYQEE+aryconbJ5DvMLq1wZBbLPUtFjB6K+MOI4kXxaRLW7dJQ3eYq92pE8sIDDmObjXWm7jG+BeXIPN8XbCzmOQ+lapGHevW6XjviF3cbup94UT2tO5svLcz1Azk1tgYCUCphKC/lD+u3ZC2+w== openpgp:0x11C9F011

将输出内容复制添加到服务端~/.ssh/authorized_keys

配置GPG agent

打开C:\Users\Your name\AppData\Roaming\gnupg文件夹,在gpg-agent.conf文件添加以下内容

enable-ssh-support enable-putty-support enable-win32-openssh-support

sshcontrol文件添加Keygrip, 注意: 添加Keygrip后需要换行

E57DFA139A46760699AB482039CC3443EB0EAB22

在Linux中使用MeXkey3的OpenPGP进行SSH验证

环境说明
  • 操作系统:Ubuntu25

1. 安装必要软件

sudo apt update
sudo apt install -y gnupg scdaemon pcscd

2. 配置设备识别

编辑libccid配置文件:

sudo sed -i -e '/<key>ifdVendorID<\/key>/{n;a \ \t\t<string>0X303A</string>'$'\n''}' /etc/libccid_Info.plist;
sudo sed -i -e '/<key>ifdProductID<\/key>/{n;a \ \t\t<string>0x0030</string>'$'\n''}' /etc/libccid_Info.plist;
sudo sed -i -e '/<key>ifdFriendlyName<\/key>/{n;a \ \t\t<string>MeXkey3</string>'$'\n''}' /etc/libccid_Info.plist

3. 配置scdaemon

echo "disable-ccid" >> ~/.gnupg/scdaemon.conf

4. 重启gpg代理服务

gpg-connect-agent killagent /bye

5. 验证设备连接

gpg --card-status

此命令应显示MeXkey3的智能卡信息。如果无输出,请尝试重新插拔设备或检查前面的步骤。

6. 启用SSH支持

echo "enable-ssh-support" >> ~/.gnupg/gpg-agent.conf
gpg-connect-agent killagent /bye
gpg-connect-agent /bye

7. 设置环境变量

# 添加到 ~/.bashrc 或 ~/.zshrc 中使永久生效
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

8. 验证SSH密钥

ssh-add -L

此命令应显示存储在MeXkey3中的SSH公钥。

9. 测试GitHub连接

ssh -T git@github.com

成功连接将显示类似:"Hi username! You've successfully authenticated..."

在WSL2中使用MeXkey3的OpenPGP进行SSH验证

环境说明
  • 操作系统:Windows 11
  • WSL2发行版:Ubuntu

1. 连接MeXkey3到WSL2

# 在Windows PowerShell中以管理员身份执行
winget install usbipd
usbipd list
usbipd bind --busid <BUSID>  # 替换为实际总线ID
usbipd attach --wsl --busid <BUSID>

📘 参考:微软官方文档-连接USB设备

2. 安装必要软件包

sudo apt update
sudo apt install -y gnupg scdaemon

3. 配置UDEV规则

# 创建规则文件
sudo nano /etc/udev/rules.d/98-mexkey3.rules

在文件中添加以下内容:

# MeXdiy MeXkey3
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="0030", GROUP="plugdev", MODE="0660"

应用新规则:

sudo udevadm control --reload-rules
sudo udevadm trigger

4. 配置GPG环境

# 检查设备连接状态
gpg --card-status

# 导入公钥(我通过服务器,你根据自己情况来)
gpg --keyserver hkps://keyserver.ubuntu.com --search-keys "邮箱或者名字"

# 启用SSH支持
echo "enable-ssh-support" >> ~/.gnupg/gpg-agent.conf
# 将密码输入改为使用win上的
echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf
echo "pinentry-program /mnt/c/Program Files (x86)/Gpg4win/bin/pinentry.exe" >> ~/.gnupg/gpg-agent.conf
gpg-connect-agent killagent /bye
gpg-connect-agent /bye

# 设置环境变量
echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
echo 'export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)' >> ~/.bashrc
source ~/.bashrc

# 验证SSH密钥
ssh-add -L

5. 创建SSH配置文件

nano ~/.ssh/config
# 如果没有.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

添加以下内容:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

6. 功能验证

# 测试GPG签名
echo "test" | gpg --clearsign

# 测试GitHub SSH连接
ssh -T git@github.com

常见问题排查

  1. 设备未识别

    • 检查lsusb是否显示MeXkey3设备
    • 重新执行usbipd wsl attach命令
    • 重启WSL实例:wsl --shutdown
  2. 权限问题

    sudo usermod -aG plugdev $USER
    sudo reboot
  3. GPG代理问题

    gpgconf --kill gpg-agent
    gpg-connect-agent /bye
  4. SSH连接失败

    • 确认GitHub已添加公钥:ssh-add -L | grep -i cardno
    • 更新GPG代理:gpg-connect-agent updatestartuptty /bye

💡 提示:首次使用需在GPG卡上输入管理员PIN(默认12345678)和用户PIN(默认123456)