亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試通過 SSH 連接到遠程主機時出錯

嘗試通過 SSH 連接到遠程主機時出錯

Go
慕村9548890 2023-07-31 15:18:13
我正在嘗試連接到遠程主機以發出命令,但在運行代碼時收到以下錯誤消息:ssh:握手失?。簊sh:沒有通用的密鑰交換算法;客戶端提供:[[email protected] 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 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

問題是......服務器只愿意通過 diffie-hellman-group1-sha1 進行對話

和:

因此,您的客戶端需要一個 的分支 golang.org/x/crypto/ssh,例如Bored-engineer/ssh,其中提交 39a91b提交 fe5e4ff確實添加了對 diffie-hellman-group1-sha1 的支持。
或者安裝最新的golang/crypto,其中包括提交 57b3e21。


查看完整回答
反對 回復 2023-07-31
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

恐慌有些奇怪。顯然,當無法就密鑰交換算法達成一致時,就會出現問題。Diffie-Hellman密鑰交換是最近才添加的(6 月 3 日)。由于您的服務器僅提供該算法,因此如果沒有它,您將無法開始。

這不是恐慌的原因(恐慌似乎發生在ssh.Dial其內部),但我會注意到,當你這樣做時:

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

您最終告訴 Go 代碼使用 diffie-hellman-group1-sha1 作為通道加密。您無需在此處添加任何內容。原因是SSHConfig.Config.Ciphers最初為零。所以你不妨這樣寫:

SSHConfig.Config.Ciphers?=?[]string{"diffie-hellman-group1-sha1"}

以獲得相同的效果,即:事情不起作用。

您可以在添加到列表之前調用SetDefaults以使列表非空,但是如果沒有此模式的實現,則添加到列表是無效的 - 即使使用新的提交,也不允許 Diffie-Hellman 進行其他任何操作比密鑰交換本身。請注意,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.


查看完整回答
反對 回復 2023-07-31
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

Diffie-hellman-group1-sha1 是一種密鑰交換算法。Config 結構中應該是 KeyExchanges 而不是 Ciphers


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

代替


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

如果未指定 KeyExchanges,則使用的默認算法可以在 ssh/common.go 中找到


// preferredKexAlgos specifies the default preference for key-exchange algorithms

// in preference order.

var preferredKexAlgos = []string{

    kexAlgoCurve25519SHA256,

    kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521,

    kexAlgoDH14SHA1,

}

可以看到,此時 kexAlgoDH1SHA1 或 diffie-hellman-group1-sha1 并未列出


查看完整回答
反對 回復 2023-07-31
  • 2 回答
  • 0 關注
  • 350 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號