Golang SSH握手过程中,报错跟客户端在算法签名上不匹配
场景:
go中编写了一个监听socket,等待客户端连接,客户端连接成功后,利用(复用)这个socket已知的socket做SSH安全认证,认证方式为用户名密码认证,报错如下:
handshake failed: ssh: invalid signature algorithm "rsa-sha2-512", expected "rsa-sha2-256"
报错原因:
出现错误的原因是 SSH 握手过程中服务器和客户端在签名算法上不匹配。具体来说,服务器支持的签名算法是 rsa-sha2-512
,而客户端(Go 程序)期望的是 rsa-sha2-256
。这导致了握手失败。
Note: 注意这时候是使用已经建立连接的socket做SSH认证,所以Go程序相当于客户端,而服务器相当于服务端。
问题分析:
SSH 协议在建立连接时会进行一个握手过程,其中包括验证服务器的公钥。在较新的 SSH 实现中,rsa-sha2-512
和 rsa-sha2-256
是常见的签名算法。如果客户端和服务器在这些算法上不匹配,就会导致握手失败。
解决办法:
- 确保golang.org/x/crypto/ssh支持该签名算法
- 可以在
ClientConfig
中显式指定支持的签名算法来解决这个问题
config := &ssh.ClientConfig{User: "root",Auth: []ssh.AuthMethod{ssh.Password(password),},HostKeyCallback: ssh.InsecureIgnoreHostKey(),// 显式指定支持的签名算法HostKeyAlgorithms: []string{"rsa-sha2-512", "rsa-sha2-256"},}
HostKeyAlgorithms
:在ClientConfig
中添加了HostKeyAlgorithms
字段,显式指定支持的签名算法。这里添加了rsa-sha2-512
和rsa-sha2-256
,以确保客户端可以接受服务器使用的签名算法。
HostKeyAlgorithms
:这个字段用于指定客户端支持的主机密钥算法。默认情况下,Go 的 SSH 客户端可能只支持某些特定的算法。通过显式指定支持的算法,可以确保客户端和服务器之间的兼容性。