这两天入手了个想要了很久的东西:YubiKey

既然买了最新的5 series,那肯定得折腾折腾它的各种玩法,不然不是亏了嘛()

所以今晚以完全新手的程度尝试玩了一下GPG密钥,发现它可以用来给GitHub上的commit签名,加上Verified标志(如下图)

不觉得这很酷吗?作为一名理工男我觉得这太酷了,很符合我对Git Commit的想象,科技并带着趣味

何X杰

网上的教程非常的多,我就不重复了,就简单分享一下我在达成上图结果的过程中遇到的一些坑吧~

pinentry

在macOS中,使用YubiKey获取密钥的时候默认使用terminal输入PIN,但这个terminal输入的PIN经常会抽风,有时候会导致根本不弹PIN,直接commit了(当然,并没有成功签上名)。所以在导入GPGkey到YubiKey之前,我建议先通过下列指令配置一下pinentry

brew install gnupg2 pinentry-mac    //使用homebrew安装pinentry和gnupg2

mkdir ~/.gnupg    // 创建GPG工作环境目录,如果已运行过gpg指令应该会自动生成,可以忽略这一行

touch ~/.gnupg/gpg-agent.conf    // 创建GPG agent设置文件,如果已有可以忽略

echo “pinentry-program /usr/local/bin/pinentry-mac” >> ~/.gnupg/gpg-agent.conf    // 为GPG agent设置pinentry的路径

killall gpg-agent   // 清除GPG agent后台(实际上就是重启一下GPG agent)

这样一来,在需要认证YubiKey中的GPG密钥时就会有弹窗出现要求输入PIN了,解决了我不弹PIN的问题

两个PIN

当使用gpg –edit-card xxx指令,输入admin打开管理员菜单后,使用passwd可以修改两个PIN,普通PIN和Admin PIN。

普通PIN就是平时认证私钥时输入的PIN,要求6位以上数字,而Admin PIN则不能使用6位PIN,需要更高位数

在显示card list的时候有一行PIN retry counter: 3 0 3。最前面的3指的是普通PIN还有几次错误机会,如果忘记密码,导致这个计数到1或者0了,可以使用passwd指令中的unblock PIN,输入Admin PIN来强制重设普通PIN并刷新重试次数到3。

记得设置密钥

我一开始没有设置密钥,怎么签都签不上,后来发现需要指定一下使用哪个密钥(草)

git config –global user.signingkey <密钥ID>   // 注意global前面是两个- 这个主题显示不出来…

如果你不需要对本机上的所有项目都设置这一个密钥,就把–global去掉,仅对当前目录下的git项目生效。

使用IDE进行Commit

我使用的是JetBrains家的IDE,似乎本身Commit不带签名功能(也可能只是我没发现)确实是我没发现,实际上是有的,在IDE设置-Version Control-Git里面(来源:CSDN)。所以只能手打git commit -S -m “message”来实现签名…吗?当然不是!你可以使用以下代码来设置默认签名

git config –global commit.gpgsign true    // 注意global前面是两个- 这个主题显示不出来…

如果你不需要对本机上的所有项目都开启签名commit功能,就把–global去掉,仅对当前目录下的git项目生效。

这样设置好之后,使用IDE进行commit的时候也会调起窗口输入PIN,然后按一下YubiKey进行签名~

记得按YubiKey

虽然这点可能没多少人会出问题,但是系统确实没有提示。。。在配置完commit密钥后进行commit的时候,首先会弹窗让你输入普通PIN,但是输完之后什么也不会发生,仍然在等待签名。这个时候其实YubiKey在闪烁,也跟使用FIDO的时候一样,需要碰一下上面的金属片来认证(这个是Yubico添加的要求)才能完成commit的签名。

添加GPG密钥到你的仓库

这个好像就更没人会犯了。。。如果你发现你能成功签名并push到git仓库,但在git仓库中显示Unverified,那么很有可能你漏了一步将GPG公钥连接到Git仓库的这一步。具体的参见你找到的教程