由于Yubikey 4部分版本里使用了Infineon生产的Secure Element,有安全漏洞。漏洞细节见ROCA: Vulnerable RSA generation (CVE-2017-15361)

于是在一个冬日的早晨,我折腾了一下手里的有问题的Yubikey。

(在我试图把Yubikey 4卡里生成的4096 RSA SSH Key导入到Github的时候,Github提示Weak SSH Key,赞一个。)

1 GPG Card 作为 SSH 登陆

gpg-agent --daemon --enable-ssh-support

然后把输出的结果(一些环境变量)放到.bashrc里。 或者手动source一下。

进一步,放在.bashrc里的可以是: (参考自1 2)

export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye
unset SSH_AGENT_PID
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

1.1 导出SSH公钥

ssh-add -L
#或者
gpg2 --export-ssh-key 

输出的key就是public key,可以放到远程服务器的authorized_keys里面

或者添加到github里。

或者添加到水木里。

1.2 跳板

ssh -A alpha.example.com

然后在alpha服务器上:

ssh bravo.example.com

就可以调用本地的yubikey了。

(这本来是ssh-agent的典型用法,用ssh-add把本地私钥加载到内存里。)

还可以一步到位:

ssh -tA alpha.example.com ssh -tA bravo.example.com  tmux att

-t是Pseduo-Terminal

2 在新机器上使用Yubikey/OpenPGP Card

(假设你已经基本知道怎么用Yubikey的OpenPGP Card功能了)

gpg --recv-keys <yourid>
或 card-edit fetch

gpg --card-status

结束。

card-status之后,会在本地机器上留下一个secret key的stub。

3 生成一个新的subkey,并迁移到卡里

gpg2 --expert --edit-key <yourid>
gpg> addkey
gpg> toggle
gpg> key 4 #选中新加的key
gpg> keytocard

更详细的见: https://gist.github.com/ageis/5b095b50b9ae6b0aa9bf

4 Key Signing 的原理解析

gpg --export <yourkey> > a.gpg
gpgsplit a.gpg

会看到有好多小文件,其中就有别人给你签过的签名。

4.1 如何un-revoke一个key?

https://lists.gnupg.org/pipermail/gnupg-users/2007-April/030726.html

结论就是如果还没有Publish,只要拆开,删掉revoke certificate再组合起来就行。

See Also