ssh ไม่สามารถเจรจาต่อรอง - ไม่พบวิธีการแลกเปลี่ยนคีย์ที่ตรงกัน


32

ฉันกำลังพยายามเข้าสู่เราเตอร์ DSL ของฉันเพราะฉันมีปัญหากับเมลบรรทัดคำสั่ง ฉันหวังว่าจะสามารถกำหนดค่าเราเตอร์ใหม่ได้

เมื่อฉันให้sshคำสั่งนี่คือสิ่งที่เกิดขึ้น:

$ ssh enduser@10.255.252.1

Unable to negotiate with 10.255.252.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1

ดังนั้นฉันจึงดูที่โพสต์แลกเปลี่ยนนี้และแก้ไขคำสั่งของฉันนี้ แต่ฉันได้รับปัญหาที่แตกต่างคราวนี้กับยันต์

$ ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 enduser@10.255.252.1

Unable to negotiate with 10.255.252.1 port 22: no matching cipher found. Their offer: 3des-cbc

มีคำสั่งให้ 3des-cbcเข้ารหัสหรือไม่ ฉันไม่แน่ใจเกี่ยวกับ 3des เช่นว่าฉันต้องการเพิ่มอย่างถาวรในระบบของฉัน

มีคำสั่งให้อนุญาต3des-cbcตัวเลขหรือไม่

ปัญหาคืออะไรที่นี่? มันไม่ได้ขอรหัสผ่าน


1
อาจจะมีคำตอบอยู่ที่นี่
Eduardo Baitello

1
Ssh มีอัลกอริธึมการเข้ารหัสที่แตกต่างกันจำนวนมากซึ่งสามารถใช้ได้และไม่มีการใช้ร่วมกันระหว่างไคลเอนต์ของคุณกับเซิร์ฟเวอร์ ลองใช้ssh -o KexAlgorithms=diffe-hellman-group-sha1 enduser@10.255.252.1เพื่อบังคับให้ไคลเอ็นต์ของคุณใช้อัลกอริทึมที่เก่ากว่าปลอดภัยน้อยกว่าและดูว่ามีเฟิร์มแวร์ล่าสุดสำหรับเราเตอร์ของคุณหรือไม่
icarus

1
ssh -vvv ...จะเปิดเผยการแลกเปลี่ยนที่สำคัญและโปรโตคอลการเข้ารหัสที่นำเสนอโดยเซิร์ฟเวอร์
David Foerster

คำตอบ:


47

ข้อผิดพลาดนี้เกิดขึ้นในขณะที่กำลังตั้งค่าช่องทางการเข้ารหัส หากระบบของคุณและระบบระยะไกลไม่แชร์รหัสอย่างน้อยหนึ่งรหัสจะไม่มีรหัสที่จะยอมรับและไม่มีช่องสัญญาณที่เข้ารหัส โดยทั่วไปแล้วเซิร์ฟเวอร์ SSH จะเสนอ ciphers ที่แตกต่างกันจำนวนเล็กน้อยเพื่อรองรับลูกค้าที่แตกต่างกัน ฉันไม่แน่ใจว่าทำไมเซิร์ฟเวอร์ของคุณจะถูกกำหนดค่าให้อนุญาต 3DES-CBC เท่านั้น

ตอนนี้ 3DES-CBC ไม่น่ากลัว มันช้าและให้ความปลอดภัยน้อยกว่าอัลกอริธึมอื่น ๆ แต่ก็ไม่สามารถแตกหักได้ทันทีหากปุ่มถูกเลือกอย่างถูกต้อง CBC เองมีปัญหาบางอย่างเมื่อ ciphertext สามารถแก้ไขได้ในระหว่างการขนส่ง แต่ฉันสงสัยอย่างยิ่งว่า HMAC ของ SSH จะถูกปฏิเสธไม่ให้เกิดผลกระทบ บรรทัดล่างมีตัวเลือกที่แย่กว่า 3DES-CBC และมีตัวเลือกที่ดีกว่า อย่างไรก็ตามควรดำเนินการอย่างระมัดระวังทุกครั้งเมื่อมีการเอาชนะค่าเริ่มต้นที่เกี่ยวข้องกับความปลอดภัยรวมถึงการเข้ารหัสและตัวเลือกอัลกอริทึมการแลกเปลี่ยนคีย์ค่าเริ่มต้นเหล่านั้นเป็นค่าเริ่มต้นด้วยเหตุผล; คนฉลาดบางคนใช้พลังสมองพิจารณาตัวเลือกและพิจารณาว่าสิ่งที่ถูกเลือกเนื่องจากค่าเริ่มต้นให้ความปลอดภัยโดยรวมที่ดีที่สุดเมื่อเทียบกับการแลกเปลี่ยนประสิทธิภาพ

ตามที่คุณค้นพบคุณสามารถใช้-c ...(หรือ-oCiphers=...) เพื่อระบุรหัสที่จะนำเสนอจากฝั่งไคลเอ็นต์ ในกรณีนี้การเพิ่ม-c 3des-cbcอนุญาตเฉพาะ 3DES-CBC จากไคลเอนต์ เนื่องจากสิ่งนี้ตรงกับรหัสที่เซิร์ฟเวอร์นำเสนอจึงสามารถสร้างช่องสัญญาณที่เข้ารหัสและการเชื่อมต่อไปยังขั้นตอนการตรวจสอบสิทธิ์

~/.ssh/configนอกจากนี้คุณยังสามารถเพิ่มนี้ไปยังส่วนบุคคลของคุณ เพื่อหลีกเลี่ยงการเปลี่ยนแปลงระดับโลกเพื่อแก้ไขปัญหาในท้องถิ่นคุณสามารถใส่ไว้ในHostบทที่ ตัวอย่างเช่นหากการกำหนดค่า SSH ของคุณในปัจจุบันระบุว่า (ตัวอย่างตัวอย่าง):

Port 9922

การระบุพอร์ตเริ่มต้นทั่วโลกเป็น 9922 แทนที่จะเป็น 22 เริ่มต้นคุณสามารถเพิ่มโฮสต์ stanza สำหรับโฮสต์ที่ต้องการกำหนดค่าพิเศษและ stanza โฮสต์ทั่วโลกสำหรับกรณีเริ่มต้น นั่นจะกลายเป็นเหมือน ...

Host 10.255.252.1
    Ciphers 3des-cbc
    KexAlgorithms +diffie-hellman-group1-sha1
Host *
    Port 9922

การเยื้องเป็นทางเลือก แต่ฉันคิดว่ามันช่วยเพิ่มความสามารถในการอ่านได้อย่างมาก บรรทัดว่างและบรรทัดที่ขึ้นต้นด้วย#จะถูกละเว้น

หากคุณเข้าสู่ระบบในฐานะผู้ใช้รายเดียวกัน (หรือส่วนใหญ่) เสมอคุณสามารถระบุชื่อผู้ใช้นั้นได้:

Host 10.255.252.1
    Ciphers 3des-cbc
    KexAlgorithms +diffie-hellman-group1-sha1
    User enduser
Host *
    Port 9922

คุณไม่จำเป็นต้องเพิ่มHost *stanza หากไม่มีสิ่งใดใน ~ / .ssh / config ของคุณที่จะเริ่มต้นเช่นเดียวกับในกรณีนั้นเฉพาะการคอมไพล์ในหรือค่าเริ่มต้นทั้งระบบ (โดยทั่วไปจาก / etc / ssh / ssh_config) ใช้

ณ จุดนี้บรรทัดคำสั่ง ssh เพื่อเชื่อมต่อกับโฮสต์นี้จะลดลงอย่างง่ายดาย

$ ssh 10.255.252.1

และผู้ใช้อื่น ๆ ทั้งหมดในระบบของคุณและการเชื่อมต่อกับโฮสต์อื่น ๆ ทั้งหมดจากระบบของคุณจะไม่ได้รับผลกระทบจากการเปลี่ยนแปลง


ในกรณีของฉันฉันต้องลบCipherบรรทัด แต่มันก็ใช้งานได้! ขอบคุณ!
carlspring

ตามหน้า man ssh_config ( ลิงค์ ) ไวยากรณ์ของไฟล์ปรับแต่งสำหรับ ciphers คือ "Cipher s " (หมายเหตุถึงส่วนท้าย)
MikeV

28

โอเคฉันอ่าน manpage แล้วคิดออก

ฉันไม่ต้องการแก้ไขไฟล์ปรับแต่งของฉันดังนั้นฉันจึงค้นหาคำว่า "cipher" ในหน้า man ที่แสดง-cตัวเลือกให้ฉัน; ทำให้ฉันสามารถระบุประเภทการเข้ารหัสได้ คำสั่ง end นั้นเป็น:

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c 3des-cbc enduser@10.255.252.1

4
ระวังด้วยการเลือกตัวเลขด้วยมือคุณอาจจะเลือกอันที่อ่อนแอได้ง่าย ๆ เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไร (การใช้งานและอื่น ๆ )
heemayl

Ditto @heemayl 3DES-CBC นั้นไม่ได้เลวร้ายนัก แต่ก็มี ciphers รองรับ OpenSSH เวอร์ชั่นล่าสุดอย่างน้อยซึ่งมีไว้สำหรับจุดประสงค์และจุดประสงค์ทั้งหมดอย่างสมบูรณ์ เหยียบอย่างระมัดระวัง
CVn

3

ฉันเพิ่งพบปัญหานี้โดยใช้ PuTTY เพื่อเชื่อมต่อกับ Ubuntu รุ่นใหม่กว่า ดูเหมือนว่า PuTTY รุ่นก่อนหน้านี้ไม่มีการปรับปรุงเลขศูนย์ ดังนั้นการดาวน์โหลด PuTTY รุ่นล่าสุดจึงช่วยแก้ไขปัญหาได้ นั่นอาจเป็นทางออกอื่น


1
แม้ว่าเราเตอร์มักจะไม่ได้รับการปรับปรุงหรือสนับสนุนโดยผู้ผลิตเป็นอย่างดี
คนที่แต่งตัวประหลาด

0

อีกคำตอบสำหรับ MacOSX และ CLI comamnds (SFTP เป็นต้น): อ้างอิงถึงบทความนี้ @ http://www.openssh.com/legacy.html (ตัวเลือก OpenSSL Legacy) ฉันได้รับข้อผิดพลาดที่สอดคล้องกันของ "ไม่สามารถเจรจาต่อรอง" ซึ่งแก้ไขโดยข้อมูลในบทความนี้โดยเฉพาะการตั้งค่าพารามิเตอร์การกำหนดค่าในไฟล์ "~ / .ssh / config"

BTW ฉันได้รับข้อผิดพลาดนี้เมื่อเซิร์ฟเวอร์ SFTP ปลายทางของฉัน (ไม่อยู่ภายใต้การดูแลของฉัน) ในที่สุดก็ปิด TLS 1.0 (ตัวเลือกการเข้ารหัส SSL) และต้องใช้ TLS 1.1 หรือ 1.2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.