OpenBSD 和 RHEL 上的 ssh-keygen 及其 -Z 选项

OpenBSD 和 RHEL 上的 ssh-keygen 及其 -Z 选项

我跟着关于 SSH 证书的相当好的文本为 RHEL 6 编写openssh-5.3p1-94.el6(这使得它已有大约 10 年历史),同时尝试模仿我当前 OpenBSD 系统上的示例。

其中一个例子显示创建主机 CA 密钥,然后签署主机的 RSA 密钥:

ssh-keygen -s ~/.ssh/ca_host_key -I host_name -h -Z host_name.example.com -V -1w:+54w5d /etc/ssh/ssh_host_rsa.pub
Enter passphrase:
Signed host key /root/.ssh/ssh_host_rsa-cert.pub: id "host_name" serial 0 for host_name.example.com valid from 2015-05-15T13:52:29 to 2016-06-08T13:52:29

当我在 OpenBSD 上尝试这个时,我没有得到输出for host_name.example.com。文字说

-Z选项将此证书限制为域内的特定主机。

...我对此有点困惑OpenBSD 手册ssh-keygen(1)-Z根本没有提到任何选项。我也对ssh-keygen接受这个未记录的选项而不抱怨感到困惑。

看着的源代码ssh-keygen-Z选项已接受,但似乎与“格式密码”(或可能是“密码格式”)有关,而不是与主机名有关(前提是我正在查看正确的代码):

case 'Z':
    openssh_format_cipher = optarg;
    break;

查看旧版本的代码,它有总是与“格式密码”有关。

OpenSSH 的发行说明不提了-Z

问:ssh-keygen在 RHEL 6 上(我不确定该版本是否相关,但有关 RHEL 7 或 RHEL 8 的 SSH 证书的等效文档似乎不可用)是否使用仅 RedHat 的补丁进行了修补,从而导致-Z行为不同?

答案1

太长;博士;对于较新版本的 OpenSSH,您应该使用该-n选项而不是-Z设置主体(例如主机名或用户)。

查看 的源代码ssh-keygen,该-Z选项已被接受,但似乎与“格式密码”有关

是的,您没有收到错误的原因是因为openssh_format_cipher在创建证书时不使用该变量,而仅在生成带有密码的密钥时使用该变量。

如果您使用生成密钥ssh-keygen -f ./path -Z some_garbage并设置密码短语,您将收到错误消息。

RHEL 6 上是否ssh-keygen使用 RedHat 专用补丁进行了修补,从而使-Z行为有所不同?

是的,以前是这样。你可以在openssh-5.3p1-ssh-certificates.patchfrom中看到这里:

+               case 'Z':
+                       cert_principals = optarg;
+                       break;
                case 'p':

该补丁不再在较新的 rpm 中使用。

答案2

扩展@mosvy 答案,因为它比仅仅评论要长一些。

RHEL6 从 2009 年随 OpenSSH 5.3p1 一起发布(我认为最初它是旧版本,但我现在手头没有它),多年来新功能被实现或从上游反向移植,包括用于 SSH 证书的功能。

但这是很晚的事了。多年来,通过 NSS 最初支持智能卡(更新日志可以追溯到 2007 年),NSS 接管-nssh-keygen.例如描述了它是如何工作的在这篇 2008 年的博文中(我无法找到这个补丁是否是上游提出的,或者为什么它被拒绝,但现在智能卡是直接通过标准 PKCS#11 接口使用的)。有关更多信息,请参阅上一个答案中链接的源 rpm 中的 openssh-5.3-p1-nss-keys.patch。

仅在 OpenSSH 5.4p1 发布并支持证书一段时间后,就决定向后移植此特定功能(在可追溯至 2013 年的变更日志中),并且与现有交换机发生冲突(现在ssh-keygen使用字母表中的所有字母,如果我记得很清楚),向后移植此功能的唯一方法是将选项移动到不同的交换机(现有场景无法通过较小的更新来破坏)并记录下来。

这就是整个故事。

相关内容