ssh ส่งอะไรเมื่อทำการเจรจาสำคัญ


10

เมื่อระบุไฟล์ข้อมูลเฉพาะไปที่ ssh:

ssh -i ./id_rsa ...

ฉันมีบรรทัดเหล่านี้ในการติดตามการดีบัก ssh:

debug1: Offering public key: ./id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply

มันหมายความว่า ssh ที่สร้างขึ้นid_rsaมีเลขชี้กำลัง RSA สาธารณะหรือไม่ id_rsaรูปแบบดูเหมือนจะค่อนข้างชัดเจนว่ามีคีย์ส่วนตัวพร้อมกับบล็อก "BEGIN PRIVATE KEY" ดังนั้น "การเสนอคีย์สาธารณะ" ต้องหมายถึงสิ่งอื่นนอกเหนือจาก "การส่งคีย์สาธารณะไปยังเซิร์ฟเวอร์"

แก้ไข:

เพื่อชี้แจงฉันต้องการทราบว่าเกิดอะไรขึ้นหลังบรรทัด "คีย์สาธารณะที่เสนอ" หากไคลเอนต์มีหลายคีย์พวกเขาทั้งหมดจะถูกนำเสนอไปยังเซิร์ฟเวอร์ทีละคน


เพื่อเพิ่มปัญหานั้นมีวิธีให้เซิร์ฟเวอร์ตรวจสอบว่าเราได้รับรหัสที่ดีก่อนการท้าทายหรือไม่ เพราะฉันมีเซิร์ฟเวอร์ปฏิเสธกุญแจของเราก่อนที่ฉันจะยกเลิกการเข้ารหัส ข้อผิดพลาดที่มีเนื่องจากชื่อไม่ได้ระบุไว้อย่างดี
Gopoi

คำตอบ:


12

ในการเชื่อมต่อกับเซิร์ฟเวอร์ SSH และรับรองความถูกต้องกับพับลิกคีย์สาธารณะ / ส่วนตัวของคุณคุณต้องแชร์คีย์สาธารณะของคุณกับเซิร์ฟเวอร์ก่อน

สิ่งนี้ทำได้โดยการคัดลอกกุญแจสาธารณะสำหรับกุญแจส่วนตัวของคุณไปยังเซิร์ฟเวอร์และเพิ่มลงใน~/ssh/authorized_keysทั้งโดยการคัดลอก / วางคัดลอกid_rsa.pubไป~/.ssh/authorized_keysยังเซิร์ฟเวอร์หรือด้วยการcat id_rsa.pub >> ~/.ssh/authorized_keysต่อท้ายรายการ

เมื่อคุณเชื่อมต่อเซิร์ฟเวอร์จะใช้กุญแจสาธารณะของคุณเพื่อลงนามในการท้าทายและลูกค้าของคุณใช้กุญแจส่วนตัวของคุณid_rsaเพื่อถอดรหัสความท้าทายเข้ารหัสอีกครั้งกับสาธารณะของเซิร์ฟเวอร์host keyและส่งกลับ

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

ที่ NO POINT ในการแลกเปลี่ยนคือกุญแจส่วนตัวของคุณหรือกุญแจส่วนตัวของโฮสต์ที่แลกเปลี่ยนหรือเปิดเผยต่อกัน พับลิกคีย์ของคุณถูกเก็บไว้บนเซิร์ฟเวอร์ แต่นั่นเป็นสาเหตุว่าทำไมมันจึงเป็นพับลิกคีย์


ใช่นั่นคือทั้งหมดที่ดีและดี แต่ทั้งหมดนี้เกิดขึ้นก่อนที่เซิร์ฟเวอร์ระบุรหัสสาธารณะเพื่อเข้ารหัสความท้าทายด้วย ฉันมีหลายคีย์และพวกเขาทั้งหมด "เสนอ" ไปยังเซิร์ฟเวอร์ทีละ สิ่งที่ไม่เกี่ยวข้อง และใช่ฉันรู้ว่ารหัสส่วนตัวไม่ได้ถูกส่งจริง ๆ ฉันควรลบเส้นนั้นออกจากคำถามทั้งหมด : P
Alex B

เมื่อคุณระบุว่าssh -i keynameคุณกำลังบอกไคลเอ็นต์ ssh ของคุณว่าคุณต้องการใช้คีย์ใดในการเชื่อมต่อกับเซิร์ฟเวอร์ หากคุณมีคีย์โหลใน~/.ssh/ไคลเอนต์ของคุณจะไม่ซ้ำผ่านแต่ละคีย์ มันจะมองหา~/.ssh/id_rsa, ~/.ssh/id_dsaอาจชื่อไฟล์อื่น ๆ ไม่กี่คนที่จะเขียนเป็นลูกค้าหรือสิ่งที่สำคัญคือการระบุไว้สำหรับการเป็นเจ้าภาพในการที่~/.ssh/config... เรื่องยาวสั้น; ลูกค้าของคุณไม่ได้ / เสนอ / คีย์ใด ๆ ไปยังเซิร์ฟเวอร์
cpbills

เมื่อคุณเชื่อมต่อ / ไคลเอนต์ของคุณ / ถอดรหัสการท้าทายจากเซิร์ฟเวอร์และจากนั้นไปที่รายการของคีย์ส่วนตัวในพื้นที่ที่ได้มาตรฐานเพื่อเข้ารหัสการท้าทายเพื่อส่งการตอบสนอง หากการตอบสนองต่อความท้าทายล้มเหลวมัน / อาจ / ย้ายไปยังชื่อคีย์ที่ใช้รหัสถัดไปเข้ารหัสใหม่ด้วย / that / คีย์ส่วนตัวและลองอีกครั้ง อีกครั้งกุญแจสาธารณะและส่วนตัวของคุณไม่ได้ / แชร์ / กับเซิร์ฟเวอร์ที่ตรวจสอบการเข้าสู่ระบบ
cpbills

1
โอ้ฉันอ่านความคิดเห็นของคุณอีกครั้ง โฮสต์: เข้ารหัสความท้าทายด้วยรหัสโฮสต์ลูกค้า: ถอดรหัสความท้าทายด้วยรหัสโฮสต์ผับลูกค้า: เข้ารหัสความท้าทายด้วยรหัสส่วนตัวโฮสต์: พยายามถอดรหัสความท้าทายด้วยรหัสสาธารณะที่แสดงรายการทั้งหมดใน~/.ssh/authorized_keysโฮสต์รู้ว่าความท้าทายคืออะไรและกำลังมองหาอะไร เพื่อให้เมื่อมีการปลดล็อคกุญแจสาธารณะก็จะรู้ว่าจะใช้กุญแจนั้น
cpbills

@cpbills ขอโทษที่ฉันลืมพูดถึงฉันมีคีย์ไม่กี่ตัวจากตัวแทนที่ส่งต่อดังนั้นจึงมีการเสนอหลายคีย์ (-vvv บันทึกจะแสดงให้เห็นทั้งหมดที่เสนอแม้ว่าฉันจะระบุไฟล์ข้อมูลประจำตัว)
อเล็กซ์ B

1

การเข้ารหัสคีย์สาธารณะ / ส่วนตัวขึ้นอยู่กับระบบที่ง่ายมาก:

คุณมีพับลิกคีย์ที่สามารถทำการเข้ารหัสแบบทางเดียวและไพรเวตคีย์ที่สามารถยกเลิกการเข้ารหัสได้ รหัสสาธารณะสามารถมอบให้กับทุกคนในโลกและจะไม่มีใครสามารถถอดรหัสข้อมูลที่เข้ารหัสของคุณแม้ว่าพวกเขาจะสามารถเข้ารหัสข้อมูลที่คุณสามารถถอดรหัสด้วยรหัสส่วนตัวของคุณ

ดังนั้นคำตอบสำหรับคำถามของคุณคือ "กุญแจสาธารณะของคุณ"


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

ใช่. มันไม่ ssh-keygen - คุณจะให้กุญแจสาธารณะของรหัสส่วนตัวกลับไม่ทำงาน
23945 MâttFrëëman

1

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

ฉันเชื่อว่ามันพูดOffering public key: ./id_rsaเพราะใช้คีย์ส่วนตัว (เก็บไว้ใน./id_rsa) เพื่อทำการเข้ารหัสบนข้อความธรรมดาที่เซิร์ฟเวอร์รู้จักและจากนั้นเซิร์ฟเวอร์จะใช้กุญแจสาธารณะเพื่อถอดรหัส ciphertext นี้และยืนยันว่าตรงกับข้อความธรรมดา ./id_rsa.pubไคลเอนต์คีย์สาธารณะไม่ควรต้องการไฟล์หลังจากการสร้างคีย์เริ่มต้น เซิร์ฟเวอร์นี้ใช้เพื่อถอดรหัสเท่านั้น


ฉันสงสัยว่าสิ่งนี้จะเกิดขึ้น แต่ฉันต้องการเฉพาะบางอย่าง (เช่นโปรโตคอลการเจรจาคีย์ SSH จริง) ไม่แน่ใจว่าทำไมคุณลงคะแนน
อเล็กซ์ B

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