前言

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: SCtrust: ultimate      validity: ultimate
ssb  rsa2048/****************created: 2021-03-22  expires: never       usage: Ecard-no: 000615524
ssb  rsa2048/****************created: 2021-03-22  expires: never       usage: Scard-no: 000615524
ssb  rsa2048/****************created: 2021-03-24  expires: never       usage: Acard-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可以正常使用。
设置方法:

  1. 会话连接属性->连接->用户身份验证->选择PublicKey并调整至第一个,用户密钥选择“无”。
  2. 会话连接属性->连接->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
    感谢以上文档作者提供的帮助

将自己的SSH密钥对导入YubiKey 5的PIV和智能卡模块,配合Putty和XShell使用相关推荐

  1. 使用SSH密钥对给你的阿里云ECS加把安全锁

    转载自https://bbs.aliyun.com/read/578607.html?spm=a2c4e.11155507.3.9.dQlfY0 先说一下:什么是 SSH 密钥对 引用 SSH 密钥对 ...

  2. Windows下Putty使用ssh密钥对远程连接阿里云服务器

    文章目录 一.背景 二.密钥对 1.创建密钥对 2.绑定密钥对至服务器实例 三.配置安全组规则 四.生成PUTTY格式的私钥 五.Putty使用密钥对远程登录服务器 六.配置Putty长时连接 七.踩 ...

  3. 阿里云服务配置SSH密钥对登陆

    文章目录 阿里云服务配置SSH密钥对登陆 前言 SSH密钥对概述 SSH密钥对介绍 功能优势 使用限制 1 登陆云服务控制台 2 创建密钥对下载私钥 3 绑定ECS实例 4 修改私钥文件属性 5 运行 ...

  4. linux添加sshkey,使用SSH密钥对连接Linux实例

    本地为Linux或其它支持SSH命令的环境 本节介绍如何在Linux或其他支持SSH命令的环境(如Windows下的MobaXterm)下使用SSH密钥对登录Linux实例. 方式一 找到您所下载的. ...

  5. SSH密钥对登录的原理和实践

    SSH密钥对登录的原理和实践 1.ssh密钥对登录的基本思路是:要登录谁,就把公钥放到谁身上,就可以授权登录谁. 2.本地登录设备称为ssh客户端,被登录的设备称为ssh服务器. 3.原理图描述如下: ...

  6. XShell使用SSH密钥对连接阿里云ECS

    写在开头 远程连接的方式很多,这里推荐使用SSH密钥的方式进行登录,优点如下: 安全性:SSH密钥对登录认证更为安全可靠. 密钥对安全强度远高于常规用户口令,可以杜绝暴力破解威胁. 不可能通过公钥推导 ...

  7. 一文带你了解什么是ssh密钥以及如何创建SSH密钥对

    SSH密钥是什么? SSH是一种网络协议,用于计算机之间的加密登录.最早的时候,互联网通信都是明文通信,一旦被截获,内容就暴露无疑.1995年,芬兰学者Tatu Ylonen设计了SSH协议,将登录信 ...

  8. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块) 一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其它内 ...

  9. 不同路由器下远程ssh登录Beaglebone系统(通过路由器端口转发,配合花生壳的DDNS功能)

    使用场景: 一般家庭设备都是通过路由器中转连上互联网的,而且运营商给家庭宽带分配的IP地址也是动态的.随时可能变动的.所以当程序员们离开家之后,是很难直接和家里的设备进行交互的.但是通过TPLINK路 ...

最新文章

  1. 后门BROOTKIT代码学习和原理分析
  2. Django中的日期和时间格式 DateTimeField
  3. SQL--Chapter1_Overview of SQL Server
  4. arm学习笔记五(c/c++与arm汇编混合编程)
  5. 第 3-3 课:泛型和迭代器 + 面试题
  6. Unable to execute dex: GC overhead limit exceeded
  7. hasOwnProperty.call
  8. java 页面级缓存_用CashFilter实现页面级缓存实践
  9. 如何在Python中将元素添加到列表
  10. C#中英文逗号之间的相互转化
  11. ubuntu文字界面与图形界面切换
  12. 概率论从入门到放弃?布朗学霸火到宕机的毕业作品,让统计“看得见”
  13. dependencies.dependency.version' for org.hibernate:hibernate-validator:jar is missing.
  14. 数据-第18课-栈与递归
  15. Badboy工具:简介,安装,脚本录制
  16. html js 鼠标变图片大小,js之图片变大变小效果
  17. 每天写工作日志、周报你怎么看?
  18. 微信渐变国旗头像来了!一键生成
  19. SpringBoot整合Mybatis-Plus
  20. V神最新发文:Rollups有望成为以太坊扩容的基石

热门文章

  1. 如何简单使用纯CSS3模仿时钟的指针转动
  2. Linux下通过ioctl修改IP信息
  3. 组播路由协议基础——PIM-SM BSR工作机制
  4. 大衣哥唱火的《火火的情怀》,和合国际会100万向孟文豪收购吗
  5. python水位传感器输出水位_如何使用物联网水位传感器监测水位?
  6. Sputtr--万能搜索引擎
  7. U盘识别不了如何恢复,如何恢复不能识别的U盘
  8. 网页自适应rem如何适配_rem详解及使用方法
  9. 手机连接无线没有网络连接到服务器是怎么回事啊,手机连接WIFI后无法上网,是怎么回事?...
  10. check的3种用法