在开发连接到服务器的 ssh 工具时,我看到了以下情况:
在 Windows(使用 plink)中,它使用ssh-ed25519
服务器密钥类型进行握手并确认其指纹。另一方面,在 Ubuntu 中,在 ssh 命令之后,它使用ECDSA
服务器密钥类型。
视窗:
The server's ssh-ed25519 key fingerprint is:
ssh-ed25519 255 xx:0e:84:ce:ca:ac:2f:e0:e8:f2:0a:fb:0e:a0:xx:xx
乌本图:
ECDSA key fingerprint is MD5:xx:69:68:81:bd:9b:a0:6d:23:31:91:1d:be:71:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
服务器在 /etc/ssh 中包含多种 ssh 密钥类型,我知道您可以通过取消注释来强制使用具体类型,例如HostKey /etc/ssh/ssh_host_ecdsa_key
在 sshd_config 中。但我的问题是;为什么 Windows 默认使用与 Ubuntu 不同的类型,反之亦然?是因为 plink/openssh 的客户端配置还是在服务器端?
答案1
PuTTY 客户端使用中定义的顺序连接 → SSH → 主机密钥设置项,默认为以下顺序:
Ed25519
Ed448
ECDSA
RSA
DSA
单个“ECDSA”项涵盖所有ecdsa-sha2-nistp*
算法。我不太清楚内部顺序,但服务器通常不会提供多种变体,所以这并不重要。
OpenSSHssh
客户端使用 定义的顺序HostKeyAlgorithms
,默认顺序大致为:
ecdsa-sha2-nistp256,
ecdsa-sha2-nistp384,
ecdsa-sha2-nistp521,
ssh-ed25519,
rsa-sha2-512,
rsa-sha2-256,
ssh-rsa
(为了清楚起见,我删除了所有-cert
和-sk
算法——没有人使用它们,但全局顺序无论如何都是一样的。整个列表在源树的 myproposal.h 中定义为 KEX_DEFAULT_PK_ALG。自 2013 年首次添加 Ed25519 支持以来,顺序并没有真正改变,尽管添加了 rsa-sha2 并删除了 ssh-dss。)
答案2
SSH 连接中涉及的所有算法,包括主机密钥类型都是通过相同的过程来选择的:
- 首先,服务器和客户端交换各自支持的算法列表
- 然后一方(在本例中为客户端)从通常支持的算法中挑选出它喜欢的算法。
PuTTY 首选 Ed25519。OpenSSH 首选 ECDSA。在这两种情况下,首选主机密钥类型的顺序都是可配置的。