使用Yubikey来加密Git提交和连接SSH

本文章介绍了如何用Yubikey里的GPG密钥来加密Git的提交,以及无密码通过SSH连接服务器

注意,在操作之前,请务必让电脑的GPG软件里有对应私钥的公钥。没有公钥,私钥是无法使用的

macOS的操作说明

在macOS通过gpg-agent来通过SSH连接服务器

只要你安装了GPG Suite,理论上就应该安装了gpg-agent。你可以使用这条命令看看是否有安装

1
2
❯ which gpg-agent
/usr/local/MacGPG2/bin/gpg-agent

我们还需要安装pinentry-mac,这个软件可以在请求使用GPG的时候弹出一个GUI窗口让你输入PIN

如果没有这个软件,你就只能在命令行里输入PIN,这在某些没有命令行的软件调用GPG时会直接失败

1
brew install pinentry-mac

接着我们需要去gpg的配置文件里启用gpg-agent

1
vim ~/.gnupg/gpg-agent.conf

在里面输入这些配置内容,注意pinentry-program的路径要根据你的情况修改,如果不知道就用which pinentry-mac查看下

1
2
3
4
default-cache-ttl 600
max-cache-ttl 7200
pinentry-program /opt/homebrew/bin/pinentry-mac
enable-ssh-support

然后我们还需要修改.zshrc文件,或者你的其他rc文件,这样才能在shell执行之前确保gpg-agent正常工作

1
vim ~/.zshrc

在末尾添加这些内容

1
2
3
export GPG_TTY="$(tty)"
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent

保存,然后新开一个shell,现在你可以测试能不能看到ssh公钥了

1
2
❯ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQChSDO0UPpvHhEfR/s10/loc4YcXkButNgnE0fzH6DYhGYqJvLR3wC/l1fRqh5jEBu0LH+4jVymyIpJDB7ifOhA1y0lw7Vev4Clga6dlhYHpIOdIe3mo1Btjma76e8ciik38oxNR2Eh0dMcghWa+Sn1PBRLDV1BkxlrFPjTTnSxJO5KBaaVDbfEbCZB3ltLZonnRLLw0fZ6YXkNrZGLikhlv9m2Tjx0MmwuCzzWASV+d61Ql0WQjZ+H4Sb1x6Uupw5BXoucb4FE8d/v/M88NkPXi8v3CKx3ncWccqw1U7Dv6LeGQGF9ocSMejDjvgCwk5Pz6ThSBs38GimeFYNsS0otq/E3bWZFVBHEdOBnyeUwv74WpjhxV+HewKddnGdeabse6TTmGjgP6HsGGTHheWJXfs4TXivG9MTzkHNscygWmbVfemUsaYEzkgYA6jxFrWTsI2dJdcdTuDU38GXS1r5ybP8ECWYoqrUst/QkZw6sHr9Vi+ssefOSTBmxdxA394APCwd9lsa+b7vKrBr0Q55Pb8hrHfanrzN8luyFr7VX26VHNNIPMt4XEo5CN4plXu6A4GqLlPRyV7uxNNfV2fLbqN6c2iEd+R44BmP6T8nTDL/TI/J51GNGhhTkHz/PCl1LZ4fZlUiQ3VdUuUwSRr7W4GcAwcwy2DgXR6ecvox8BQ== cardno:22 526 936

如果你想无密码通过ssh登录某台服务器,只需要上去,将刚刚打印出的公钥粘贴到服务器的~/.ssh/authorized_keys文件即可

如果你想在 Royal TSX 这种外部软件也能直接登录服务器,需要注意让其使用系统内置的shell,不要用软件提供的shell,因为我们gpg-agent是配置到内置shell的rc文件里的

在macOS给Git提交签名

我们需要先查看密钥的私钥ID

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
❯ gpg --list-secret-keys --keyid-format LONG
/Users/hongdou/.gnupg/pubring.kbx
---------------------------------
sec#  rsa4096/7E84F69969F0AAA4 2023-02-13 [C]
      C157ABBAFB66ACC6039069747E84F69969F0AAA4
uid                   [ 未知 ] Hong Dou <[email protected]>
uid                   [ 未知 ] Bin Wang <[email protected]>
uid                   [ 未知 ] sukidesuka <[email protected]>
ssb>  rsa4096/51C93F62422C1141 2023-02-13 [S] [有效至:2024-02-13]
ssb>  rsa4096/D5D423A7DD89E1B2 2023-02-13 [E] [有效至:2024-02-13]
ssb>  rsa4096/2E7E13D2B575E640 2023-02-13 [A] [有效至:2024-02-13]

以我的为例,我的私钥ID就是7E84F69969F0AAA4

其实你也可以直接查看你的卡片,效果类似

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
❯ gpg --card-status
Reader ...........: Yubico YubiKey OTP FIDO CCID
Application ID ...: D2760001240103040006225269360000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 22526936
Name of cardholder: Bin Wang
Language prefs ...: en
Salutation .......: 
URL of public key : [未设定]
Login data .......: [未设定]
Signature PIN ....: 非强制
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 102
KDF setting ......: off
Signature key ....: 5322 C718 ED38 B0E3 F6FF  8D50 51C9 3F62 422C 1141
      created ....: 2023-02-13 08:35:16
Encryption key....: 9A0C 2414 560D 8050 7702  29BB D5D4 23A7 DD89 E1B2
      created ....: 2023-02-13 08:36:19
Authentication key: D613 36BC 6E57 7F10 B8FD  7D34 2E7E 13D2 B575 E640
      created ....: 2023-02-13 08:37:23
General key info..: sub  rsa4096/51C93F62422C1141 2023-02-13 Hong Dou <[email protected]>
sec#  rsa4096/7E84F69969F0AAA4  创建于:2023-02-13  有效至:永不     
ssb>  rsa4096/51C93F62422C1141  创建于:2023-02-13  有效至:2024-02-13
                                卡号: 0006 22526936
ssb>  rsa4096/D5D423A7DD89E1B2  创建于:2023-02-13  有效至:2024-02-13
                                卡号: 0006 22526936
ssb>  rsa4096/2E7E13D2B575E640  创建于:2023-02-13  有效至:2024-02-13
                                卡号: 0006 22526936

然后我们需要配置Git,让他用这个私钥去签名

1
2
git config --global commit.gpgsign true
git config --global user.signingkey 7E84F69969F0AAA4

现在你用git去提交的时候,就会使用私钥去签名了

Windows的操作说明

在Windows通过gpg-agent来通过SSH连接服务器

你需要在%APPDATA%\gnupg\gpg-agent.conf这个文件里写入下面内容

1
2
3
4
5
6
enable-ssh-support
enable-putty-support
enable-win32-openssh-support
use-standard-socket
default-cache-ttl 600
max-cache-ttl 7200

然后重启电脑或者注销一下,就可以看到生效了

1
2
PS C:\Users\srauni> ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQChSDO0UPpvHhEfR/s10/loc4YcXkButNgnE0fzH6DYhGYqJvLR3wC/l1fRqh5jEBu0LH+4jVymyIpJDB7ifOhA1y0lw7Vev4Clga6dlhYHpIOdIe3mo1Btjma76e8ciik38oxNR2Eh0dMcghWa+Sn1PBRLDV1BkxlrFPjTTnSxJO5KBaaVDbfEbCZB3ltLZonnRLLw0fZ6YXkNrZGLikhlv9m2Tjx0MmwuCzzWASV+d61Ql0WQjZ+H4Sb1x6Uupw5BXoucb4FE8d/v/M88NkPXi8v3CKx3ncWccqw1U7Dv6LeGQGF9ocSMejDjvgCwk5Pz6ThSBs38GimeFYNsS0otq/E3bWZFVBHEdOBnyeUwv74WpjhxV+HewKddnGdeabse6TTmGjgP6HsGGTHheWJXfs4TXivG9MTzkHNscygWmbVfemUsaYEzkgYA6jxFrWTsI2dJdcdTuDU38GXS1r5ybP8ECWYoqrUst/QkZw6sHr9Vi+ssefOSTBmxdxA394APCwd9lsa+b7vKrBr0Q55Pb8hrHfanrzN8luyFr7VX26VHNNIPMt4XEo5CN4plXu6A4GqLlPRyV7uxNNfV2fLbqN6c2iEd+R44BmP6T8nTDL/TI/J51GNGhhTkHz/PCl1LZ4fZlUiQ3VdUuUwSRr7W4GcAwcwy2DgXR6ecvox8BQ== cardno:22_526_936

不想重启电脑也可以尝试重启gpg-agent让其立即生效

1
2
3
4
5
6
7
PS C:\Users\srauni> gpg-connect-agent killagent /bye
OK closing connection

PS C:\Users\srauni> gpg-connect-agent /bye
gpg-connect-agent: no running gpg-agent - starting 'C:\Program Files (x86)\Gpg4win\..\GnuPG\bin\gpg-agent.exe'
gpg-connect-agent: waiting for the agent to come up ... (5s)
gpg-connect-agent: connection to agent established

在Windows给Git提交签名

与mac一样,你需要先查看私钥id,然后修改git的config

不同点在于,在Windows,你还需要指定gpg的路径,所以命令是这样的

注意你需要根据自己的情况修改gpg的路径

1
2
3
git config --global user.signingkey 7E84F69969F0AAA4
git config --global commit.gpgsign true
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计