如何生成与 ssh 配置一起使用的证书文件?

如何生成与 ssh 配置一起使用的证书文件?

我的 ~/.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只需执行以下操作:

  1. 提取公钥

    openssl x509 -in CERT.crt -pubkey -noout > CERT.pub.tmp
    
  2. 转换为 SSH 格式 (PKCS8)

    ssh-keygen -f CERT.pub.tmp -i -m PKCS8 > CERT.pub
    

相关内容