为一个身份文件指定多个 SSH 签名证书

为一个身份文件指定多个 SSH 签名证书

我想要实现签名证书以进行 SSH 身份验证。我已按照以下步骤操作这里现在我正在尝试弄清楚如何在我的系统上实现它。

例如,我们有两个环境:生产环境和测试环境;每个环境都有自己的“用户密钥”来签署其他密钥。我希望能够控制谁可以访问每个环境,但我遇到的不便之处在于允许一个用户使用同一个私钥访问两个环境。

从“ssh”的手册页中的“-iidentity_file”中:

ssh 还将尝试从通过在身份文件名后附加 -cert.pub 而获得的文件名中加载证书信息

这似乎意味着我必须拥有私钥的多个副本(只是名称不同)并相应地命名证书文件,此外还要添加 .ssh/config 文件条目才能使用正确的证书。

据我所知,如果您在 .ssh/config 中指定多个 IdentityFile 条目,ssh 将尝试每个条目。但是,似乎没有选项(至少我在文档中找不到)来指定证书。

有没有办法在 .ssh/config 中指定证书文件(除假定的 -cert.pub 之外)或包含要检查的证书列表的文件?

答案1

以下内容在装有 OpenSSH 7.4p1 的 Debian Stretch 上对我有用:

将每个证书放在单独的文件中,例如:

~/.ssh/id_ed25519-cert-ca1.pub
~/.ssh/id_ed25519-cert-ca2.pub

然后在 ~/.ssh/config 中列出您的证书文件:

CertificateFile ~/.ssh/id_ed25519-cert-ca1.pub
CertificateFile ~/.ssh/id_ed25519-cert-ca2.pub

现在 ssh 命令应该自动尝试并选择正确的证书。

来自 man ssh_config:

配置文件中可以指定多个证书文件;这些证书将按顺序尝试。多个证书文件指令将添加到用于身份验证的证书列表中。

答案2

我不知道好的方法来做到这一点,但我知道两种方法。

  1. ssh-agent 似乎很乐意为单个身份存储多个证书。因此,例如,如果您id_ed25519的 id 为id_ed25519-cert1.pubid_ed25519-cert2.pub,则可以执行以下操作:

    cp id_ed25519-cert1.pub id_ed25519-cert.pub
    ssh-add id_ed25519
    cp id_ed25519-cert2.pub id_ed25519-cert.pub
    ssh-add id_ed25519
    

    现在两个证书都可以用于身份了。同样,这不是一个好的解决方案。

  2. 为指向同一身份的其他身份创建符号链接,并为每个身份提供自己的证书。或者直接复制它们。同样,这很丑陋,但应该可以工作。

  3. 您可能想将多个证书(因为每个证书占一行)放在一个 -cert.pub 文件中。在我的系统上,这只能识别第一行。

  4. 为了增加趣味性,请注意使用证书签名身份将不经确认覆盖现有证书。

我认为,这里的根本问题是,适用于主机的 CA 模型并不适用于授权用户。对主机密钥进行签名(假设您指定了主体)是验证——它仅表明通过此签名您知道服务器的主机密钥可以合法地识别它。

签署用户密钥同样意味着验证但这里还有一个额外的问题授权—— CA 的签名表明该密钥可以合法识别用户应该允许用户登录到该机器。

主机密钥和用户密钥实际上并不是双重的,因为与服务器发起握手与登录是不可同日而语的(即使您的能力受到限制),因此不能如此处理。

相关内容