我的 ~/.ssh/config 文件中有如下配置:
Host xxx
HostName 127.0.0.1
Port 2222
User gigi
ServerAliveInterval 30
IdentityFile ~/blablabla
# CertificateFile ~/blablabla-cert.pub
效果很好,但我很好奇如何生成CertificateFile
如果真的想使用它?考虑一个已经拥有使用例如生成的私有和公共 RSA 密钥openssl req -newkey rsa:2048 -x509 [...]
。
SSH 使用的认证证书模型是公钥认证方法的一种变体。使用证书,每个用户(或主机)的公钥由另一个密钥签名,称为证书颁发机构 (CA)。同一个 CA 可用于签署多个用户或主机密钥。然后,用户或主机可以信任单个 CA,而不必信任每个单独的用户/主机密钥。因为这是身份验证模型的变化,所以实现证书需要在客户端和服务器端都进行更改。
另外,请注意 SSL 使用的证书(由 生成的证书
openssl
)与 SSH 使用的证书不同。安全 SE 上的这些 QA 解释了这个主题:SSL 和 SSH 有什么区别?,在 OpenSSL 和 OpenSSH 之间转换密钥。现在,由于问题是关于客户端如何使用 SSH 证书连接到服务器,让我们看看这种方法。手册页
ssh-keygen
有一些相关信息:我们在这里需要的第一件事是 CA 密钥。CA 密钥是一个常规的私钥-公钥对,所以让我们像往常一样生成一个:
该
-f ca
选项只是将输出文件名指定为“ca”。这导致生成两个文件 - ca(私钥)和 ca.pub(公钥)。接下来,我们将使用 CA 的私钥签署我们的用户密钥(按照手册中的示例):
这将生成一个名为的新文件
~/.ssh/id_rsa-cert.pub
,其中包含 SSH 证书。该-s
选项指定 CA 私钥的路径,该-I
选项指定在服务器端记录的标识符,该-n
选项指定主体(用户名)。可以通过运行来验证证书的内容ssh-keygen -L -f ~/.ssh/id_rsa-cert.pub
。此时,您可以自由编辑配置文件 (~/.ssh/config) 并包含
CertificateFile
指向新生成证书的指令。正如手册所示,该IdentityFile
指令还必须与它一起指定以识别相应的私钥。最后要做的是告诉服务器信任您的 CA 证书。您需要将 CA 证书的公钥复制到目标服务器。这是通过编辑
/etc/ssh/sshd_config
文件并指定TrustedUserCAKeys
指令来完成的:完成后,重新启动服务器上的 SSH 守护程序。在我的 CentOS 系统上,这是通过运行
systemctl restart sshd
. 之后,您将能够使用您的证书登录系统。ssh
使用详细标志 ( )跟踪您的连接-v
将显示提供给服务器的证书以及接受它的服务器。这里要注意的最后一件事是,使用相同 CA 密钥签名的任何用户密钥现在都将受到目标服务器的信任。在任何实际情况下都必须控制对 CA 密钥的访问。还有一些指令
AuthorizedPrincipalsFile
可以用来限制来自服务器端的访问。有关更多详细信息,请参阅sshd_config 的手册。在客户端,也可以使用更严格的规范创建证书。有关这些详细信息,请参阅ssh-keygen 的手册。要将您转换
.crt
为.pub
仅执行此操作:提取公钥
转换为 SSH 格式 (PKCS8)