我正在尝试使用签名证书来使用 SSH。我用来ssh -i keys/client.key
连接到目标设备。如果我从该私钥(带有 )生成公钥ssh-keygen -y -f keys/client.key
并将其放入 .ssh/authorized_keys 文件中,我就可以毫无问题地进行连接。
我想做的是使用 CA 来允许全部由该 CA 签名的密钥以作为该用户登录。我曾经 ssh-keygen -y -f keys/ca.key
生成一个公钥并将其作为“cert-authority sh-rsa AAAB3N.....Z”放入authorized_keys中。我对不同网站的理解是它现在应该“有效”,但事实并非如此。在客户端,我只是收到“权限被拒绝(公钥)”。我的文件中没有其他列表authorized_keys
。在服务器端,我没有收到任何错误消息,只收到客户端已断开连接的消息。
我错过了一些简单的事情吗?我怎样才能调试为什么它不起作用。
编辑#1
我使用 EasyRSA 生成私钥,这是通过 openssl 调用的一些 shell 脚本。我认为问题可能是生成了私钥,然后生成了 CSR,然后生成了签名证书。因此,我认为私钥没有以任何方式“签名”。
编辑#2
我尝试了ssh-keygen -s ca.key -I key client.key
一下,得到“do_ca_sign:无法打开“client.key””。我用新生成的 RSA 密钥进行了尝试ssh-keygen
,效果很好,所以 ca.key 似乎没问题。我认为 openssl 生成的私钥有一些它不喜欢的东西。
答案1
- 您的客户没有提供证书,因为它没有证书。您需要生成一个 (
ssh-keygen -s keys/ca.key -I jruser -n jruser keys/client.key.pub
)。新证书 (keys/client.key_cert.pub
) 将自动被服务器拾取ssh
并提交给服务器。 - 您的
cert-authority
线路authorized_keys
缺少所需的principals
分配(例如principals="jruser"
)。 - 要调试它,您可以
ssh -v
照常使用。当使用证书身份验证时,身份验证算法的名称中包含“cert”。 - 我建议使用
TrustedUserCAKeys
选项 (insshd_config
) 而不是编写cert-authority
行,因为它是 ssh 用户证书的较旧且经过更充分测试的形式。
设置此功能(以及主机密钥证书)的一个很好的简明指南是如何使用 Ubuntu 创建 SSH CA 来验证主机和客户端。
答案2
这里似乎发生了多个问题......
主要的困惑是你签名民众密钥而不是私钥。如果您尝试签署名为“id_rsa”的私钥,ssh-keygen 将忽略该私钥并在同一目录中使用“id_rsa.pub”。如果该公钥不存在,那么当您尝试签署不存在的文件时,它只会给您相同的错误消息。
另外,登录时,如果您使用名为“some.key”的私钥,则您签名的公钥需要名为“some.key-cert.pub”并且位于同一目录中,否则它将不会使用该公钥整个事情都行不通。
至于“主体”...如果您有它们(它们是可选的),它们会指定您实际可以以哪些用户身份登录。因此,如果您使用主体签署公钥,那么您只能使用它以这些用户身份登录。