在与 ssh 连接之前,如何将 .pem 私钥指纹条目添加到 known_hosts?

Jaz*_*epi 6 ssh ssh-keys

警告 -> 阅读此问题描述时请小心。在写这个问题时,我有一些不正确的假设。请务必阅读我的回答,解释我错在哪里!

我在 AWS 中有主机 A 作为 EC2 实例。

我是一个嵌入在 .PEM 文件中的私钥,我可以用它来托管带有 SSH 密钥 Z 的 A。如果我使用-l参数将它传递给 ssh 命令,并且如果我关闭了严格的主机检查,这会起作用-o StrictHostKeyChecking=no

即使我“知道”这是正确的主机,我也强烈希望保留严格的主机检查,因为我正在与 AWS 接口交互,从它们获取 ip/dns,并且我在我自己的小 VPC 世界中.

似乎提供指纹-> 主机映射的唯一方法是在known_hosts文件中提供它。

那是对的吗?

如果这是正确的,我如何获取嵌入在我从 AWS 获得的 .PEM 文件中的私钥,并为单个指纹构建正确的条目 -> 临时known_hosts文件的主机映射,我可以在登录时读取该文件EC2 实例?

我不想做的事

  • 使用ssh-keyscan. 所有这一切都是盲目地接受远程客户端的指纹,而不验证它是否与密钥匹配。我认为?
  • 关掉StrictHostKeyChecking。我想尽早建立良好的实践,我现在需要知道如何做到这一点,因为我将需要知道一般如何做到这一点。(this我的意思是如何根据我拥有的密钥使用 SSH 指纹来验证我正在连接的主机的身份。)
  • 乱搞ssh-add。我想将其写入一个易于锁定访问的文件,而不是将其放入正在运行的进程中。

编辑:奇怪的是,当我尝试从 pem 文件中提取指纹时,它与我在连接时看到的指纹不匹配,并提示我。

从 PEM 中提取指纹

bash-4.2$ ssh-keygen -l -E md5 -f ./blah.PEM
2048 MD5:be:b1:d7:e1:f0:0f:ce:41:60:fa:97:dc:b8:2c:ed:08 no comment (RSA)
bash-4.2$ ssh-keygen -l -E sha1 -f ./blah.PEM
2048 SHA1:g2PDmIcw19Z/v7HTco6xRWxQ88c no comment (RSA)
Run Code Online (Sandbox Code Playgroud)

SSH 提示期间的指纹显示

bash-4.2$ ssh -i ./blah.PEM ubuntu@ip-172-31-6-91.us-east-2.compute.internal
The authenticity of host 'ip-172-31-6-91.us-east-2.compute.internal (172.31.6.91)' can't be established.
ECDSA key fingerprint is SHA256:ibwhkrF5oMapJla4cKuXgePT5lHmg08L7yMp6auCpgo.
ECDSA key fingerprint is MD5:ba:82:53:ee:89:22:26:63:26:11:21:93:63:1f:1d:d1.
Run Code Online (Sandbox Code Playgroud)

指纹怎么会不一样,但是钥匙还是可以连接的?

Ser*_*nov 7

你有 2 个密钥对在那里玩:

  1. 服务器的私钥/公钥。

服务器上的 ssh 守护进程在/etc/ssh/文件夹中创建并存储了一组私钥

您从服务器获取的 RSA 指纹来自与私钥对应的/etc/ssh/ssh_host_rsa_key公钥

  1. 用户的私钥/公钥。

这是您拥有的密钥对。私钥应安全地存储在您的计算机上并用于向服务器进行身份验证。公钥在服务器上,在您的配置文件的 authorized_keys 文件中:~/.ssh/authorized_keys


所以有2个不同的公钥,它们的指纹不会匹配,除非你使用与服务器上的私钥相同的私钥,这是不太可能的。

要消除警告,请完全按照它的要求执行:将服务器的指纹放入/var/lib/jenkins/.ssh/known_hosts文件中。


小智 5

如果我理解正确的话,私钥文件归您所有,您希望获取它的指纹,以便可以将其添加到您的known_hosts文件中。如果这是正确的,那么你要做的就是:

$ ssh-keygen -yf /path_to_private_key/key_file_name
Run Code Online (Sandbox Code Playgroud)

这将输出类似:

ssh-rsa AAAAB3NzaC....
Run Code Online (Sandbox Code Playgroud)

最后,在其前面加上您通过 SSH 访问的 IP 地址,这样您就可以得到:

10.200.25.5 ssh-rsa AAAAB3NzaC....
Run Code Online (Sandbox Code Playgroud)

您可以将其添加为文件中的一行known_hosts