ลายนิ้วมือคีย์ SSH คืออะไรและสร้างได้อย่างไร


128

ฉันมักจะพบว่าฉันได้รับข้อความนี้เมื่อฉันsshเข้าสู่เครื่องใหม่:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

มันหมายถึงอะไร เครื่องทุกเครื่องจะมีลายนิ้วมือเหมือนกันทุกครั้งหรือไม่?

ลายนิ้วมือเหล่านี้สร้างขึ้นมาได้อย่างไร? พารามิเตอร์เหล่านี้ขึ้นอยู่กับอะไร

คำตอบ:


65

ลายนิ้วมือนั้นขึ้นอยู่กับกุญแจสาธารณะของโฮสต์โดยทั่วไปจะใช้ "/etc/ssh/ssh_host_rsa_key.pub" โดยทั่วไปแล้วจะมีการระบุตัวตน / ตรวจสอบความถูกต้องของโฮสต์ที่คุณกำลังเชื่อมต่ออยู่

หากมีการเปลี่ยนแปลงลายนิ้วมือแสดงว่าเครื่องที่คุณกำลังเชื่อมต่อมีการเปลี่ยนรหัสสาธารณะ สิ่งนี้อาจไม่ใช่สิ่งเลวร้าย (เกิดขึ้นจากการติดตั้ง ssh ใหม่) แต่ก็อาจบ่งบอกว่าคุณกำลังเชื่อมต่อกับเครื่องอื่นที่อยู่ในโดเมน / IP เดียวกัน (เกิดขึ้นเมื่อคุณเชื่อมต่อผ่านโหลดบาลานเซอร์) หรือคุณ มีการกำหนดเป้าหมายด้วยการโจมตีแบบคนกลางซึ่งผู้โจมตีกำลังดักจับ / เปลี่ยนเส้นทางการเชื่อมต่อ ssh ของคุณเพื่อเชื่อมต่อกับโฮสต์อื่นซึ่งอาจเป็นการสอดแนมผู้ใช้ / pw ของคุณ

Bottom line:หากคุณได้รับการเตือนของลายนิ้วมือที่เปลี่ยนแปลงโปรดใช้ความระมัดระวังและตรวจสอบอีกครั้งว่าคุณกำลังเชื่อมต่อกับโฮสต์ที่ถูกต้องผ่านการเชื่อมต่อที่ปลอดภัย แม้ว่าส่วนใหญ่เวลานี้จะไม่เป็นอันตราย แต่ก็สามารถบ่งบอกถึงปัญหาที่อาจเกิดขึ้น

ดู: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
และ: http://en.wikipedia.org/ วิกิพีเดีย / Public_key_fingerprint


5
"... ต้องระมัดระวังและตรวจสอบอีกครั้งว่าคุณกำลังเชื่อมต่อกับโฮสต์ที่ถูกต้องผ่านการเชื่อมต่อที่ปลอดภัย" - คำถามที่โง่ แต่คุณจะทำสิ่งนี้ได้อย่างง่ายดายได้อย่างไร?
Savara

1
@Savara เมื่อคุณเชื่อมต่อกับเซิร์ฟเวอร์ SSH ที่คุณไม่ได้เชื่อมต่อมาก่อนคุณควรขอรหัสสาธารณะของเซิร์ฟเวอร์ SSH จากผู้ดูแลเซิร์ฟเวอร์ ผู้ดูแลระบบเซิร์ฟเวอร์จะให้ข้อความแก่คุณ ~/.ssh/known_hostsคุณควรท้ายข้อความนี้ไปยังแฟ้ม วิธีนี้เมื่อคุณเชื่อมต่อกับเซิร์ฟเวอร์ไคลเอ็นต์ SSH ของคุณจะรับรู้เซิร์ฟเวอร์นี้เนื่องจากคุณได้บันทึกกุญแจสาธารณะknown_hostsไว้ ดังนั้นจริง ๆ แล้วคุณไม่ควรพูดว่า "ใช่" เมื่อไคลเอนต์ SSH บอกคุณว่า "ความถูกต้องของโฮสต์ไม่สามารถสร้างได้" คุณควรเพิ่มรหัสสาธารณะของเซิร์ฟเวอร์ไว้เสมอ
Utku

@Savara หากคุณทำเช่นนี้คุณจะรู้ว่ามีบางสิ่งที่ไม่ดีเกิดขึ้นเมื่อไคลเอ็นต์ SSH ของคุณบอกคุณว่า "ความถูกต้องของไคลเอ็นต์ไม่สามารถสร้างได้" หรือเมื่อมีการแจ้งให้คุณทราบ "รหัสสาธารณะของเซิร์ฟเวอร์เปลี่ยนไป" ดังนั้นคุณควรเพิ่มพับลิกคีย์ของเซิร์ฟเวอร์ไปยัง~/.ssh/known_hostsไฟล์ของคุณล่วงหน้าและอย่าบอกว่าใช่เมื่อไคลเอ็นต์ SSH ของคุณบอกคุณว่า "ไม่สามารถสร้างความถูกต้องของไคลเอ็นต์ของแท้" หรือเมื่อมันบอกคุณว่า "พับลิกคีย์ของเซิร์ฟเวอร์นั้นได้รับแล้ว การเปลี่ยนแปลง"
Utku

3
ใช่ฉันรู้อย่างถ่องแท้ว่ากลไกในการดูลายนิ้วมือ SSH นั้นทำงานได้อย่างไร แต่มีเวลาส่วนใหญ่ที่คุณไม่มีตัวเลือกในการรับลายนิ้วมือผ่านช่องทางอื่น TOFU เป็นสิ่งที่น่าเศร้าที่เรามักจะได้รับ
Savara

มีวิธีการตรวจสอบความถูกต้องแม้หลังจากตอบ "ใช่"?
แลกเปลี่ยน

104

คุณสามารถสร้างลายนิ้วมือสำหรับกุญแจสาธารณะโดยใช้ssh-keygenเช่น:

ssh-keygen -lf /path/to/key.pub

ตัวอย่างที่เป็นรูปธรรม (ถ้าคุณใช้รหัสสาธารณะ RSA):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

ส่วนแรก(2048)คือความยาวของคีย์เป็นบิตส่วนที่สอง(00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)คือลายนิ้วมือของคีย์สาธารณะและส่วนที่สามเป็นที่ตั้งของไฟล์คีย์สาธารณะ


คุณรู้วิธีแปลเป็น 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 รูปแบบนี้จากกุญแจสาธารณะนั้นหรือไม่
Kit Ho

@KitHo ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณหรือไม่ ฉันอัปเดตตัวอย่างตามที่ฉันคิดว่าssh-keygen -lfจะทำในสิ่งที่คุณต้องการ
เบนจามินเคส

5
เมื่อ SSH กำลังเข้าสู่เครื่องใหม่สิ่งที่เห็นไม่ใช่ลายนิ้วมือ pubkey ของผู้ใช้ แต่เป็นลายนิ้วมือ pubkey ของโฮสต์ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pubดังนั้นเป็นตัวอย่างที่ดีสำหรับบริบทคำถามคือ มันแสดงให้เห็นลายนิ้วมือที่ยังแสดงให้เห็นในการเข้าสู่ระบบ SSH เพื่อ localhost
tanius

57
ssh-keygenรายงานsha256ลายนิ้วมือของฉัน เพื่อที่จะได้ลายนิ้วมือฉันวิ่งmd5 ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub#archlinux
Justin C

5
(@JustinC) OpenSSH เวอร์ชั่น 6.8 (มีนาคม 2015) ขึ้นไปเปลี่ยนเป็น SHA256 ซึ่งแสดงใน base64 แทนที่จะเป็น hex โดยค่าเริ่มต้น สำหรับการใช้งานของลูกค้าssh -o FingerprintHash=md5หรือเทียบเท่าในssh_configและในสิ่งที่ใช้เช่นssh scp
dave_thompson_085

72

ลายนิ้วมือคือ MD5 เหนือข้อมูลไบนารีภายในพับลิกคีย์ที่เข้ารหัส Base64

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

md5sum 6530389635564f6464e8e3a47d593e19 เป็นลายนิ้วมือที่ปรากฏขึ้นเมื่อคีย์ถูกสร้างขึ้นโดยไม่มีเครื่องหมายโคลอนแยกเท่านั้น


อย่างไรก็ตามหากคุณจัดการกับลายนิ้วมือที่ Amazon แสดงในคอนโซลคู่คีย์ EC2 โชคไม่ดีที่อาจเป็นสัตว์ร้ายอื่น หากเป็นสตริงเลขฐานสิบหก 32 หลักเป็นรหัสลายนิ้วมือกุญแจสาธารณะ MD5 SSH มาตรฐานด้านบน แต่ถ้าเป็นเลขฐานสิบหก 40 หลักจริงๆแล้วมันเป็นลายนิ้วมือที่คำนวณโดยการใช้ SHA1 ของคีย์ส่วนตัวในรูปแบบ PKCS # 8:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58

1
ฉันพบคำตอบนี้มีประโยชน์ในสถานการณ์ต่อไปนี้ ระบบของคุณใช้ SHA1 เพื่อคำนวณลายนิ้วมือ แต่เพื่อนของคุณใช้ md5 ฉันแชร์ลายนิ้วมือซึ่งเป็น SHA1 และมันไม่ตรงกับ MD5 ที่ระบบของเธอสร้างขึ้น สิ่งนี้ช่วย - ขอบคุณ! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa

สิ่งนี้มีความเกี่ยวข้องอย่างมากในการทำความเข้าใจว่าทำไมลายนิ้วมือนี้จะไม่ตรงกับที่อยู่ในระเบียน DNS SSHFP เนื่องจากใช้การแยกย่อย SHA-1 หรือ SHA-256
neirbowj

1
@Liczyrzepa ฟิลด์ publickey อาจหรืออาจไม่มี '==' ในตอนท้ายขึ้นอยู่กับชนิดของคีย์และบิต ปลอดภัยและ IMO ใช้งานง่ายขึ้นawk '{print $2}' /path/to/keyfile.pubหรือคล้ายกัน
dave_thompson_085

13
นี่เป็นคำตอบเดียวที่อธิบายวิธีการคำนวณลายนิ้วมือ
2559

2
อย่างไรก็ตามใน Linux Mint คำสั่งคือ:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze

13

หากคุณต้องการตรวจสอบไฟล์คีย์ SSH เพื่อดูว่ามันเหมือนกับสิ่งที่รายงานว่าเป็น "Deploy key" โดย github สิ่งนี้เหมาะสำหรับคุณ ...

จาก URL ส่วนตัว: https://github.com/<username>/<repo_name>/settings/keys คุณจะเห็น ภาพหน้าจอจาก GitHub

ที่สถานี:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

คุณจะสังเกตเห็นว่าคุณได้รับลายนิ้วมือเดียวกันสำหรับทั้งกุญแจส่วนตัวและกุญแจสาธารณะ

คำสั่งเดียวกันนั้นสามารถใช้ร่วมกับคุณสมบัติที่ประณีตของ GitHub ซึ่งเป็นข้อเท็จจริงที่ว่าพวกเขาให้บริการกุญแจสาธารณะ SSH ของผู้ใช้สาธารณะที่ https://github.com/<username>.keys

นี่คือหนึ่งซับที่คุณสามารถใช้เพื่อใช้ประโยชน์จากมัน

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B

1
ssh-keygen -r host.name.com

จะส่งออกลายนิ้วมือสำหรับพับลิกคีย์สาธารณะที่กำหนดค่าทั้งหมดในอินสแตนซ์ sshd

จากนั้นสามารถใส่ลงในระเบียนDNS SSHFP

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