前言
YubiKey是什么东西我就不多说,简单的说是一种用来保存私钥的硬件设备,私钥一旦写入就无法读出,比起保存在硬盘里的私钥文件,更安全。前段时间入手一个YubiKey 5 NFC,最近一直在研究怎么用来登录SSH。
需求
我手上已经有了一个SSH密钥对用来管理着几十台Linux服务器,,在Yubikey Mmanager
-> PIV
中只能重新生成密钥对,并且无法导出私钥,然而我不想更换的我的私钥,与我的需求不符。在入手后的10天的里,每天都在研究怎么搞定这个问题……google都快翻烂了。
解决
1.将PGP密钥写入SmartCard智能卡
我是先用GnuPG4win生成PGP密钥对,然后导入SSH私钥,替换掉PGP密钥的Auth子密钥。
具体过程就不细说了,可以参考下方的资料。
注意,操作前先备份好密钥,下面步骤会将私钥写入卡上,并且无法导出!!!
大概流程:
c:\>gpg -a --export-secret-keys [user-id] > [user-id].asc
c:\>gpg --edit-key [user-id]
gpg (GnuPG) 2.2.27; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec rsa2048/****************
created: 2021-03-22 expires: never usage: SC
trust: ultimate validity: ultimate
ssb rsa2048/****************
created: 2021-03-22 expires: never usage: E
card-no: 000615524
ssb rsa2048/****************
created: 2021-03-22 expires: never usage: S
card-no: 000615524
ssb rsa2048/****************
created: 2021-03-24 expires: never usage: A
card-no: 000615524
[ultimate] (1). sbdx <xxxx@google.com>
gpg>key 3 #选择A证书
gpg>keytocard #将证书转移到卡上,注意,密钥写入就无法读取了,所以提前备份
gpg>key 3 #取消选择,然后可以类似写入其他操作
...
gpg>save #保存退出
然后重新插拔YubiKey,编辑%appdata%\gnupg\gpg-agent.conf
文件,向文件内添加以下内容
enable-ssh-support
enable-putty-support
然后就可以用PUTTY愉快的使用啦~~~
如果无法使用,可以重启gpg-agent
REM 重启gpg-agent
"C:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe" killagent /bye
"C:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe" /bye
2.生成并写入PIV证书
可以用ssh-keygen生成或从OpenGPG导出为private.key
。
大概格式内容为:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,1BB7EF1B1****
CBh06xO45wNsPr4El/gnGd0Bf+vU5gp+/ku80nF2
85g2sHowq1/LJwVb0VdSb9oRhg8uokVCZAy7LvCjCB5y7
TpkKvKN1VG44eEEbFBLU6pHSRmt1N9hbBO9HiPtdHUGcgBG031
...
...
...
-----END RSA PRIVATE KEY-----
# 生成的私钥要转换成PEM格式的文件,尽量不要设置密码
# 如果有密码,请在后面加上-p参数取消即可
ssh-keygen -p -f private.key -m pem
1) 使用私钥创建X.509证书请求
期间会让你输入一些证书信息,随便输入,SSH不认识这些东西…
openssl req -new -key private.key -out mykey.csr
2) 使用私钥自己签发证书请求
openssl x509 -req -days 3650 -in mykey.csr -signkey private.key -out mykey.crt
OK,证书创建成功,你会得到两个文件,私钥private.key
和证书mykey.crt
,请求文件mykey.csr
可以删了!
写入Yubikey
#导入证书文件
C:\>yubico-piv-tool -s 9a -a import-certificate -i mykey.crt
Successfully imported a new certificate.
#导入密钥文件,触摸策略是每次都touch,可选never、cached
C:\>yubico-piv-tool -s 9a -a import-key --touch-policy=always -i private.key
Successfully imported a new private key.
配合XShell使用
需要用到一款开源软件WinCryptSSHAgent,使用Pagent代理请求PIV证书,非常简单方便,在打开XShell前启动软件即可。经过测试,XShell5、XShell7可以正常使用。
设置方法:
- 会话连接属性->连接->用户身份验证->选择PublicKey并调整至第一个,用户密钥选择“无”。
- 会话连接属性->连接->SSH->勾选“v5:使用密码处理的Xagent(SSH代理)”/“v7:使用Xagent进行身份验证”
XShell官方的方法是使用PCKS#11验证,很麻烦,要装插件,具体可以参考下面的官方文档。
特别感谢
感谢WinCryptSSHAgent作者buptczq开发出这么棒的开源工具。
感谢WinCryptSSHAgent作者buptczq耐心与我线上沟通找出使用中的问题。
参考资料
- GPG入门教程 - 阮一峰的网络日志
- 使用 GPG 管理 SSH 密钥 | King’s Way — Blog
- https://zhuanlan.zhihu.com/p/24103240
- 关于GnuPG的subkey(子密钥)的使用 - franklinyang的个人空间 - OSCHINA
- 使用Yubikey 4作为OpenPGP Card | Drown in Codes
- Yubikey OpenPGP Card 略高级折腾手记 | 大专栏
- 如何将现有的SSH密钥导入GPG密钥_cumj63710的博客-CSDN博客
- 可能是最好的 Yubikey + GPG/SSH 智能卡教程
- YubiKey 初使用 & GPG 使用教程 – 小金鱼儿
- GPGTools+SSH+Yubikey+MacOS中文教程 - ETenal
- yubikey入手体验 - 灰信网(软件开发博客聚合)
- 奔跑吧 | Putty使用方法记录
- OpenPGP 套件 – 导入钥匙 - Yubikey 使用手册 - 文江博客
- Yubikey 使用手册 文档中心 - 文江博客
- 生成Linux PEM/CER格式SSH身份验证密钥 (Windows Azure) - 知识库
- 如何将现有的SSH密钥导入GPG密钥 cumj63710的博客-CSDN博客
- 使用gpg-agent的SSH功能 - DDoSolitary’s Blog
- PKCS#11的应用–USBKEY_totoxian-CSDN博客
- Openssl和PKCS#11的故事 迷茫的小莱-CSDN博客
- 使用 Yubikey 放置 OpenPGP 密钥 · Lei’s Blog
- YubiKey入手和介绍 · BlahGeek’s Blog
- Yubikey使用一年总结 · BlahGeek’s Blog
- GPG和keybase.io - 简书
- 使用BitLocker保护你的系统和数据(YubiKey篇) - 简书
- YubiKey功能之PIV - 简书
- 使用keybase给你的Github commit加上GPG Verified签名认证(keybase教程)桃饱の店-CSDN博客_keybase
- 如何在Windows上使用YubiKey NEO和GPG和Keybase设置Signed Git提交_cunfusq0176的博客-CSDN博客
- 使用YubiKey保护PGP密钥 – junwen38’s blog
- YubiKey 4 简介与配置 | K.I.S.S
- Yubikey OpenPGP Card 略高级折腾手记 | 大专栏
- Yubikey 的使用体验 - StarryVoid - Blog
- Importing keys
- SSH authentication
- YubiKey 5.2.3 Enhancements to OpenPGP 3.4
- SSH Connections with YubiKey PKCS#11 User Authentication(PIV) - Technical Support - NetSarang Computer
- 使用 Yubikey 存储 GPG Key 以及认证 SSH 登录
- OpenPGP扩展到PKCS#11
- 在Github上使用GPG的全过程 - 知乎
- GitHub - gpg/scute: PKCS#11 token on top of gpg-agent
- SSH with PIV and PKCS11
- yubico-piv-tool Manuals
- justintaft/yubikey-gpg-piv-provision: Provision yubikey gpg and piv applications easily.
- SSH with PIV and PKCS11
- SSH user certificates
- 在Windows上使用YubiKey进行SSH身份验证
- ConvertingPgpKeyToCertificate - CAcert Wiki
- Export existing private ssh key to OpenPGP card or Yubikey
- YubiKey Manager (ykman) CLI & GUI Guide — YubiKey Manager documentation
感谢以上文档作者提供的帮助