我将 ssh 密钥存储在 yubikey 上,因此磁盘上没有任何私钥文件。当我也使用 OpenSSH 证书进行身份验证时,这给我带来了问题。如果我想使用 ssh-agent 携带证书,我需要以某种方式将其添加到代理中。
如果我有一个名为 priv 的私钥和一个名为 priv-cert.pub 的证书,则会自动完成此操作。但由于我没有文件,我无法找到将证书文件添加到代理的方法。
有谁知道如何做到这一点?
似乎没有对此支持,我发现了这个功能请求:https://bugzilla.mindrot.org/show_bug.cgi?id=2472
答案1
Yubikey 文档提到您可以将证书添加到ssh-agent
此处https://developers.yubico.com/PIV/Guides/SSH_user_certificates.html
答案2
带有证书和硬件令牌的 ssh
这个问题可能已经很老了,但硬件身份验证现在变得越来越普遍。只要私钥由ssh-agent
或类似的替代品提供gpg-agent
,以下内容就应该使用不同的硬件密钥。
长话短说
只需提供您的公钥-i
文件中的命令参数ssh
:
ssh -o CertificateFile=yubikey-cert.pub -i yubikey.pub [email protected]
一步步
本指南已经过 ssh 版本测试:
OpenSSH_7.9p1 Raspbian-10+deb10u2+rpt1, OpenSSL 1.1.1n 15 Mar 2022
假设私钥已在硬件令牌上创建。绝对没有办法从令牌中检索私钥并将其存储在文件中。该密钥只能由模拟ssh-agent
并提供常用SSH_AUTH_SOCK
环境变量的软件驱动程序访问。为了使用密钥,该驱动程序与硬件令牌进行通信,并且密钥的任何使用都发生在令牌的微控制器上。
获取公钥
需要令牌私钥的公钥。这密钥的哈希值可以通过以下方式看到:
ssh-add -l
输出:
4096 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx cardno:000000000000 (RSA)
这公钥可以检索并存储在文件中:
ssh-add -L > yubikey.pub
输出:
cat yubikey.pub
ssh-rsa AAA.........XXX== cardno:000000000000
签署公钥
现在可以使用公钥进行签名证书颁发机构私钥,创建证书:
ssh-keygen -s ca.key -I "keyID" -n user -z 4711 yubikey.pub
这将生成证书文件yubikey-cert.pub
。当然正确的密钥ID和连续剧-z
应提供(参数)。
使用证书
现在可以直接在命令中使用证书ssh
。不依赖隐式机制,可以ssh
在命令行上传递密钥和证书。这私钥当然必须在ssh-agent
.
ssh -o CertificateFile=yubikey-cert.pub -i yubikey.pub [email protected]
为了排除故障,-v
可以使用 ssh 开关来获取有关使用哪个密钥和证书的更多详细信息:
ssh -v -o CertificateFile=yubikey-cert.pub -i yubikey.pub [email protected]
输出(为简洁起见被截断):
...
debug1: Will attempt key: yubikey-cert.pub RSA-CERT SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx explicit
debug1: Will attempt key: yubikey.pub RSA SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx explicit agent
debug1: Will attempt key: ...
...
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: yubikey-cert.pub RSA-CERT SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx explicit
debug1: Server accepts key: yubikey-cert.pub RSA-CERT SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx explicit
debug1: Authentication succeeded (publickey).
...
ssh 证书的完整教程超出了本答案的范围。更多信息可以在例如OpenhSSH 食谱。