Паника несколько странная. Ясно, что что-то идет не так, когда алгоритм обмена ключами не может быть согласован. Как отмечает VonC , обмен ключами Диффи-Хелмана был добавлен лишь недавно (3 июня). Поскольку ваш сервер предлагает только этот алгоритм, вы не сможете начать без него.
Это не является причиной паники (которая, кажется, происходит внутри самого ssh.Dial
), но я отмечу, что когда высделайте это:
SSHConfig.Config.Ciphers = append(SSHConfig.Config.Ciphers, "diffie-hellman-group1-sha1")
вы скажете код Go только для , используя diffie-helman-group1-sha1 в качестве шифрования канала. Вы не добавляете к чему-либо здесь. Причина в том, что SSHConfig.Config.Ciphers
изначально равен нулю. Так что вы могли бы также написать:
SSHConfig.Config.Ciphers = []string{"diffie-hellman-group1-sha1"}
, чтобы получить тот же эффект, а именно: вещи не будут работать.
Вы можете позвонить SetDefaults
такчто список непустой перед добавлением в список, но добавление в список неэффективно, если нет реализации для этого режима - и даже с новыми коммитами, Диффи-Хелман не разрешен ни для чего, кроме обмена ключамисам. Обратите внимание, что ssh.Dial
вызывает ssh.NewClientConn
, что составляет здесь и начинается с:
fullConf := *config
fullConf.SetDefaults()
SetDefaults
, в свою очередь, здесь и содержит:
if c.Ciphers == nil {
c.Ciphers = preferredCiphers
}
var ciphers []string
for _, c := range c.Ciphers {
if cipherModes[c] != nil {
// reject the cipher if we have no cipherModes definition
ciphers = append(ciphers, c)
}
}
c.Ciphers = ciphers
, который сначала говорит, что если конфиг Ciphers
не установлен, он должен использовать значения по умолчанию, а затем сразу после этого отфильтровывает любую строку, которая не находится в cipherModes
,Это, в свою очередь, определяется здесь и начинается с этого комментария:
// cipherModes documents properties of supported ciphers. Ciphers not included
// are not supported and will not be negotiated, even if explicitly requested in
// ClientConfig.Crypto.Ciphers.
Эта фраза отсутствует в документации. Так должно быть! Шифры, которые не включены, не поддерживаются и не будут согласовываться, даже если явно указано в ClientConfig.Crypto.Ciphers
.
(См. Последнюю ссылку выше для набора шифров, которые являются *Поддерживается 1054 *. Обратите внимание, что этот список со временем увеличивался.)