Ошибка при попытке подключения через SSH к удаленному хосту - PullRequest
2 голосов
/ 19 октября 2019

Я пытаюсь подключиться к удаленному хосту, чтобы выдать команду, но я получаю следующее сообщение об ошибке при выполнении кода:

ssh: сбой рукопожатия: ssh: нет общегоалгоритм обмена ключами;клиент предложил: [curve25519-sha256@libssh.org ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521 diffie-hellman-group14-sha1], сервер предложил: [diffie-hellman-group1-sha1] паника: время выполненияошибка: неверный адрес памяти или разыменование нулевого указателя [сигнал SIGSEGV: код нарушения сегментации = 0x1 addr = 0x10 pc = 0x759836]

Вот код, который я использую:

func (SSHClient *SSH) Connect(mode int) {
    var SSHConfig *ssh.ClientConfig
    var auth []ssh.AuthMethod

    if mode == CERT_PUBLIC_KEY_FILE {
        auth = []ssh.AuthMethod{SSHClient.readPublicKeyFile(SSHClient.Cert)}
    }

    SSHConfig = &ssh.ClientConfig{
        User:            SSHClient.User,
        Auth:            auth,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        Timeout:         time.Second * DEFAULT_TIMEOUT,
    }

    SSHConfig.Config.Ciphers = append(SSHConfig.Config.Ciphers, "diffie-hellman-group1-sha1")

    client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", SSHClient.IP, SSHClient.Port), SSHConfig)

    if err != nil {
        fmt.Printf("ERROR - While trying to Dial to the host %s with error: %s", SSHClient.IP, err.Error())
        return
    }

    session, err := client.NewSession()
    if err != nil {
        fmt.Printf("ERROR - While trying to create a new session on host %s with error: %s", SSHClient.IP, err.Error())
        client.Close()
        return
    }

    SSHClient.session = session
    SSHClient.client = client
}

Есть идеи, как решить эту проблему?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Проблема в том, что .... сервер готов говорить только по diffie-hellman-group1-sha1

И:

  • golang / go, выпуск 2903: ssh: add diffie-hellman-group1-sha1, был закрыт 6 дней назад
  • golang / go / issue 17230 : предложение: x/crypto/ssh: поддержка Diffie-HellmanВ настоящее время внедряется групповой обмен из RFC 4419.

Таким образом, для вашего клиента вам понадобится форк golang.org/x/crypto/ssh, например bored-engineer / ssh , где commit 39a91b и commit fe5e4ff добавляет поддержку diffie-hellman-group1-sha1.
или устанавливает самую последнюю версию golang/crypto, которая включает совершать 57b3e21 .

0 голосов
/ 19 октября 2019

Паника несколько странная. Ясно, что что-то идет не так, когда алгоритм обмена ключами не может быть согласован. Как отмечает 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 *. Обратите внимание, что этот список со временем увеличивался.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...