使用Golang的SSH客户端时出现“Failed to dial: handshake failed: ssh: no common algorithms”错误。

4
我正在处理一个项目,使用 goftp 上传到服务器,但是(感谢这里的好心人),我将使用更安全的方法。
我计划改用ssh,并在golang中找到了这个ssh客户端here
我已设置了一个ssh服务器(freeSSHd),并且可以通过PuTTY在本地和另一台机器上成功连接。
我只更改了客户端的此部分,以使用自己的变量。
var (
    server = "127.0.0.1:22"
    username = "username"
    password = clientPassword("password")
)

当我执行ssh客户端时,ssh.Dial返回一个错误,并且发生panic并显示如下信息:"Failed to dial: handshake failed: ssh: no common algorithms"
client, err := ssh.Dial("tcp", "127.0.0.1:22", config)
if err != nil {
    panic("Failed to dial: " + err.Error())
}

我是golang的初学者,希望可以得到一些指点。提前感谢您的帮助。


2
这个线程可能会有所帮助:https://groups.google.com/d/msg/golang-nuts/UftJqQcJ1nA/_MufYD1ODw4J简而言之 - 看起来goland不支持freeSSHd使用的算法。 - Kluyg
2个回答

8
go.crypto/ssh包的源代码中,我们可以看到支持的加密算法如下:
  • aes128-ctr
  • aes192-ctr
  • aes256-ctr
  • arcfour128
  • arcfour256
而freeSSHd支持:
  • aes128-cbc
  • aes192-cbc
  • aes256-cbc
  • 3des-cbc
  • blowfish-cbc
  • rijndael128-cbc
  • rijndael192-cbc
  • rijndael256-cbc
  • rijndael-cbc@lysator.liu.se
由于客户端和服务器没有共同的加密算法,会导致错误消息。ssh包不支持CBC模式的原因很可能是由于漏洞,在golang-nuts线程中讨论过。
解决问题的方法可能是尝试安装不同的SSH服务器,例如Windows的OpenSSH

太好了!我会尝试在Windows上使用OpenSSH。 - isaganiesteron

2

虽然它并不安全,但你可以使用Go语言的库来使用被freeSSH支持的密码编码。

sshConfig.Config.Ciphers = append(sshConfig.Config.Ciphers, "aes128-cbc")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接