我的 ~/.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 [...]
。
答案1
SSH 使用的身份验证的证书模型是公钥身份验证方法的一种变体。通过证书,每个用户(或主机)的公钥都由另一个密钥(称为证书颁发机构 (CA))签名。同一 CA 可用于签署多个用户或主机密钥。然后,用户或主机可以信任单个 CA,而不必信任每个单独的用户/主机密钥。由于这是身份验证模型的更改,因此实现证书需要在客户端和服务器端进行更改。
另请注意,SSL 使用的证书(由 生成的证书openssl
)与 SSH 使用的证书不同。安全 SE 的这些 QA 解释了该主题:SSL 和 SSH 有什么区别?,在 OpenSSL 和 OpenSSH 之间转换密钥。
现在,由于问题是客户端如何使用 SSH 证书连接到服务器,所以让我们看看该方法。这手册页ssh-keygen
有一些相关信息:
ssh-keygen
支持密钥签名以生成可用于用户或主机身份验证的证书。证书由公钥、一些身份信息、零个或多个主体(用户或主机)名称以及一组由证书颁发机构 (CA) 密钥签名的选项组成。然后,客户端或服务器可以仅信任 CA 密钥并验证其在证书上的签名,而不是信任许多用户/主机密钥。请注意,OpenSSH 证书与ssl
(8)中使用的 X.509 证书格式不同,但格式要简单得多。
ssh-keygen
支持两种类型的证书:用户和主机。用户证书向服务器验证用户的身份,而主机证书向用户验证服务器主机的身份。生成用户证书:
$ ssh-keygen -s /path/to/ca_key -I key_id /path/to/user_key.pub
生成的证书将放置在
/path/to/user_key-cert.pub
.主机证书需要
-h
选项:
$ ssh-keygen -s /path/to/ca_key -I key_id -h /path/to/host_key.pub
主机证书将输出到
/path/to/host_key-cert.pub
.
我们在这里需要的第一件事是 CA 密钥。 CA 密钥是一个常规的私钥-公钥对,因此让我们照常生成一个:
ssh-keygen -t rsa -f ca
该-f ca
选项只是将输出文件名指定为“ca”。这会生成两个文件 - ca(私钥)和 ca.pub(公钥)。
接下来,我们将使用 CA 的私钥对用户密钥进行签名(按照手册中的示例):
ssh-keygen -s path/to/ca -I myuser@myhost -n myuser ~/.ssh/id_rsa.pub
这将生成一个名为 的新文件~/.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
指令来完成的:
TrustedUserCAKeys /path/to/ca.pub
完成后,重新启动服务器上的 SSH 守护程序。在我的 CentOS 系统上,这是通过运行systemctl restart sshd
.之后,您就可以使用您的证书登录系统了。ssh
使用详细标志 ( )跟踪您的连接-v
将显示向服务器提供的证书以及接受该证书的服务器。
这里要注意的最后一件事是,使用相同 CA 密钥签名的任何用户密钥现在都将受到目标服务器的信任。在任何实际场景中都必须控制对 CA 密钥的访问。还有一些指令,例如AuthorizedPrincipalsFile
可用于限制服务器端的访问。请参阅sshd_config 手册更多细节。在客户端,还可以使用更严格的规范创建证书。请参阅ssh-keygen 手册对于这些细节。
答案2
要将您的转换.crt
为.pub
只需执行以下操作:
提取公钥
openssl x509 -in CERT.crt -pubkey -noout > CERT.pub.tmp
转换为 SSH 格式 (PKCS8)
ssh-keygen -f CERT.pub.tmp -i -m PKCS8 > CERT.pub