在尝试模仿我的 OpenBSD 当前系统上的示例时,我正在关注为 RHEL 6 编写的SSH 证书和(这使得它大约有 10 年的历史)的相当好的文本。openssh-5.3p1-94.el6
其中一个示例显示创建主机 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-only 补丁进行修补,使-Z
行为有所不同?
tl;博士; 对于较新版本的 OpenSSH,您应该使用该
-n
选项而不是-Z
设置主体(例如主机名或用户)。是的,您没有收到错误的原因是因为
openssh_format_cipher
在创建证书时不使用该变量,而仅在使用密码生成密钥时使用。如果您使用密码生成密钥
ssh-keygen -f ./path -Z some_garbage
并设置密码,您将收到错误消息。是的,它曾经是。你可以
openssh-5.3p1-ssh-certificates.patch
从这里看到:该补丁不再用于较新的 rpm。
扩展@mosvy 答案,因为它比仅评论要长一些。
RHEL6 从 2009 年开始随 OpenSSH 5.3p1 一起发布(我认为最初它是旧版本,但我现在手头没有它)并且多年来从上游实施或向后移植了新功能,包括用于 SSH 证书的这一功能。
但这是相当晚的事了。几年来,通过 NSS(在可追溯至 2007 年的更新日志中)最初支持智能卡,它接管
-n
了ssh-keygen
. 例如,在 2008 年的这篇博客文章中描述了它是如何工作的(我无法找到这个补丁是否在上游提出或为什么它被拒绝,但这些天智能卡直接通过标准 PKCS#11 接口使用)。有关更多信息,请参阅上一个答案中链接的源 rpm 中的 openssh-5.3-p1-nss-keys.patch。仅在具有证书支持的 OpenSSH 5.4p1 发布后的一段时间后,决定向后移植此特定功能(在可追溯到 2013 年的变更日志中)并且与现有交换机发生冲突(如果
ssh-keygen
现在使用字母表中的所有字母,则我记得很清楚)并且如何向后移植此功能的唯一方法是将选项移动到不同的开关(现有场景无法通过小更新来破坏)并记录下来。这就是整个故事。