我跟着关于 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.patch
from中看到这里:
+ case 'Z':
+ cert_principals = optarg;
+ break;
case 'p':
该补丁不再在较新的 rpm 中使用。
答案2
扩展@mosvy 答案,因为它比仅仅评论要长一些。
RHEL6 从 2009 年随 OpenSSH 5.3p1 一起发布(我认为最初它是旧版本,但我现在手头没有它),多年来新功能被实现或从上游反向移植,包括用于 SSH 证书的功能。
但这是很晚的事了。多年来,通过 NSS 最初支持智能卡(更新日志可以追溯到 2007 年),NSS 接管-n
了ssh-keygen
.例如描述了它是如何工作的在这篇 2008 年的博文中(我无法找到这个补丁是否是上游提出的,或者为什么它被拒绝,但现在智能卡是直接通过标准 PKCS#11 接口使用的)。有关更多信息,请参阅上一个答案中链接的源 rpm 中的 openssh-5.3-p1-nss-keys.patch。
仅在 OpenSSH 5.4p1 发布并支持证书一段时间后,就决定向后移植此特定功能(在可追溯至 2013 年的变更日志中),并且与现有交换机发生冲突(现在ssh-keygen
使用字母表中的所有字母,如果我记得很清楚),向后移植此功能的唯一方法是将选项移动到不同的交换机(现有场景无法通过较小的更新来破坏)并记录下来。
这就是整个故事。