我一直有问题CI最近,由于客户端 (CI) 拒绝远程主机密钥(尽管它存在于 中known_hosts
),导致服务器部署失败。直到今天,我才意识到 SSH 保存主机密钥的格式似乎与部署插件不兼容。作为参考,兼容格式(仍然存在于我的个人机器上)类似于以下内容:
11.22.33.44 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkVf7rhfC7nLxbeIQRj2bWitUC+XLSAeQ0ap8r8rKObDXYfPdB97NZth9JCEt3OrBXuBeg4PaAEuPu2QF7WXoT60hgAP6etr0W4LqcH59yd/X0ogFP7Y7hIf6dz1txDKaW92wgUi5XShwH6vukf0gLvW6/ak1LTBuoy72gaoUvxZge4KZivz9XqvSQHNOG9KYNfh8U6cRM8YTQo5in7YD5d6REV/FUmXpvBzCa9kbVRSlQFGYEc1HidTnPnJDteas3A9y3na385O7WN64aAkg7TO8IFXKdDHSwji9ZyrCVPA5GEuyLKhDFanV8iJ7CNflHMP8TwG5FOT2bSkV0lPyl
SSH 在接受新主机密钥时当前保存的格式类似于以下内容:
11.22.33.44 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEJJEs165NgdEcD94Xg3ySFA/qgkfytxNCX1X3pB2SPgU/mHLGXCXM8+VqMBXocM8OMOq2L0fDGr5mI+nGqjhNU=
(注意:虽然我稍微篡改了公钥,但它们的原始形式仍然完全不一样。)
只有第一种格式与部署插件兼容,而第二种格式则被无条件忽略。有人能解释一下这种差异吗?
答案1
这些不是 的不同格式known_hosts
,而是 的不同密钥类型(ssh-rsa
和ecdsa-sha2-nistp256
- 在 的手册页上有详细描述sshd
)。服务器通常有更多不同类型的主机密钥,以提供与不同客户端的更广泛兼容性。
如果您在服务器上,您可以找到所有主机密钥并使用以下命令打印它们的公钥(但该行的格式不同):
$ cat /etc/ssh/ssh_host_*.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEJJEs165NgdEcD94Xg3ySFA/qgkfytxNCX1X3pB2SPgU/mHLGXCXM8+VqMBXocM8OMOq2L0fDGr5mI+nGqjhNU= user@host
文件所接受的格式known_hosts
可以使用以下方式获取(从服务器获取密钥的真实性):
$ ssh-keyscan 11.22.33.44
11.22.33.44 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEJJEs165NgdEcD94Xg3ySFA/qgkfytxNCX1X3pB2SPgU/mHLGXCXM8+VqMBXocM8OMOq2L0fDGr5mI+nGqjhNU=
#[...]
这将打印您可以直接存储在客户端文件中的格式known_hosts
。
全图(来自手册页):
这些文件中的每一行包含以下字段:标记(可选)、主机名、密钥类型、base64 编码密钥、注释。字段之间用空格分隔。