我已经使用 ssh-keygen 创建了 2 个密钥对,一个在服务器上,一个在客户端上。
然后,我将服务器的公钥添加到客户端的 $HOME/.ssh/authorized_keys 文件中,反之亦然。
当我尝试从客户端 ssh 到服务器时,仍然看到
The authenticity of host <host> can't be established
ECDSA key fingerprint is SHA256:<hash>
为什么会发生这种情况?我期望在公钥存在的情况下,主机的身份验证可以建立。另外,我自己没有创建 ECDSA 密钥,只有 RSA 密钥。这是内置密钥吗?
答案1
你让人困惑确认服务器及其主机密钥(由客户端完成)验证ssh 用户登录(由服务器完成)。
使用主机密钥在客户端上验证主机的真实性。这可以防止可能冒充您的服务器的 MITM 攻击。主机密钥保存在服务器上的文件中,/etc/ssh/ssh_host*key
客户端上的~/.ssh/known_hosts
文件中。
使用连接到服务器ssh -vvv
显示以下内容:
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:fYR10r/RKXIzOmJYbgbDi29E10oW7MLjto2plpALaBY
debug3: hostkeys_foreach: reading file "/home/xxxx/.ssh/known_hosts"
debug3: record_hostkey: found key type ECDSA in file /home/xxxx/.ssh/known_hosts:69
debug3: load_hostkeys: loaded 1 keys from xx.xx.xx.xx
debug1: Host 'xx.xx.xx.xx' is known and matches the ECDSA host key.
- 服务器发送主机密钥
- 客户端搜索密钥
known_hosts
- 客户端加载并验证密钥
您无需手动创建主机密钥,此操作会自动完成。在客户端,您无需手动添加主机密钥,因为这会在第一次连接到服务器时完成(您必须输入“yes”)。
当主机密钥由于服务器的新安装而发生变化时,您需要从文件中删除该密钥known_hosts
,否则ssh
将拒绝连接,除非您-o StrictHostKeyChecking=no
设置了选项,但我不建议这样做。
当您将服务器上的 ssh 密钥添加到客户端authorized_keys
文件时,您授权从服务器到客户端的用户进行连接,这可能不是您想要的。我建议您删除客户端上的密钥。
进一步阅读:
答案2
.pub
您收到此消息是因为“ECDSA 密钥指纹”,而不是公共 RSA 密钥。当您手动复制公钥文件的内容时.ssh/known_hosts
,指纹不包含在内。
如果您查看known_hosts
已接受该消息的任何其他条目:
The authenticity of host '<host>' can't be established.
RSA key fingerprint is SHA256:fingerprint.
Are you sure you want to continue connecting (yes/no)?
您将在密钥类型前找到一个字符串(ssh-rsa
、ecdsa-sha2-nistp256
等...)。这是指纹,可以使用ssh-keygen -lf <public_key_file>
(位于/etc/ssh/
您的服务器中)手动计算,也可以ssh-keygen -l -F <domain_or_ip>
从您的客户端计算。
此外,此消息是选项 的结果StrictHostKeyChecking
。出于安全考虑,此消息默认处于激活状态,但可以使用 禁用ssh -o "StrictHostKeyChecking=no" user@host
,这样ssh
存储指纹时就不会出现任何消息(正如我所说,不推荐)。
这个问题和你的问题有某种关联:https://serverfault.com/questions/422869/answer-yes-to-ssh-copy-id-first-time-run-by-script
答案3
您可以通过执行以下命令将您的客户端密钥传输到您的服务器(您不需要将服务器密钥传输到客户端):
ssh-copy-id <your-ssh-server-ip_or_hostname>
之后你就可以通过密钥对登录了ssh <your-ssh-server-ip_or_hostname>
编辑:
您的 ecdsa(椭圆曲线密钥)是您的服务器密钥,该密钥传输是自动的。您的服务器是否已重新安装,因此有新的服务器密钥?
您可以通过执行以下操作从客户端删除服务器密钥:
ssh-keygen -R <your-ssh-server-ip_or_hostname>