Dấu vân tay SSH là gì và nó được tạo như thế nào?


128

Tôi luôn thấy rằng tôi nhận được thông báo này khi tôi sshvào một máy mới:

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

nó đứng để làm gì? Mỗi máy sẽ có cùng một dấu vân tay mỗi lần?

Những dấu vân tay này được tạo ra như thế nào? Những thông số nào họ phụ thuộc vào?

Câu trả lời:


65

Dấu vân tay dựa trên khóa Công khai của Máy chủ, thường dựa trên "/etc/ssh/ssh_host_rsa_key.pub" Nói chung để dễ dàng xác định / xác minh máy chủ bạn đang kết nối.

Nếu dấu vân tay thay đổi, máy bạn đang kết nối đã thay đổi khóa chung của họ. Đây có thể không phải là một điều xấu (xảy ra từ việc cài đặt lại ssh), nhưng nó cũng có thể cho thấy rằng bạn đang kết nối với một máy khác ở cùng một tên miền / IP (xảy ra khi bạn đang kết nối thông qua một cái gì đó như bộ cân bằng tải) hoặc bạn đang bị nhắm mục tiêu với một cuộc tấn công trung gian, trong đó kẻ tấn công bằng cách nào đó chặn / định tuyến lại kết nối ssh của bạn để kết nối với một máy chủ khác có thể rình mò người dùng / pw của bạn.

Điểm mấu chốt: nếu bạn bị cảnh báo về dấu vân tay đã thay đổi, hãy thận trọng và kiểm tra kỹ xem bạn có thực sự kết nối với máy chủ chính xác qua kết nối an toàn không. Mặc dù hầu hết thời gian này là vô hại, nó có thể là một dấu hiệu của một vấn đề tiềm năng

Xem: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-inif.html
và: http://en.wikipedia.org/ wiki / Công_key_fingerprint


5
"... Hãy thận trọng và kiểm tra kỹ xem bạn có thực sự kết nối với máy chủ chính xác qua kết nối an toàn không" - câu hỏi ngu ngốc, nhưng làm thế nào bạn có thể làm điều này một cách dễ dàng?
Savara

1
@Savara Khi bạn đang kết nối với máy chủ SSH mà trước đây bạn không kết nối, bạn nên yêu cầu khóa chung của máy chủ SSH từ quản trị viên máy chủ. Quản trị viên máy chủ sẽ cung cấp cho bạn một đoạn văn bản. Bạn nên nối văn bản này vào tập tin ~/.ssh/known_hosts. Bằng cách này, khi bạn kết nối với máy chủ, máy khách SSH của bạn sẽ nhận ra máy chủ này, vì bạn đã lưu khóa công khai của nó vào known_hosts. Do đó, thực sự bạn không bao giờ nên nói "có" khi ứng dụng khách SSH nói với bạn "Tính xác thực của máy chủ không thể được thiết lập". Bạn phải luôn luôn thêm khóa công khai của máy chủ trước.
Utku

@Savara Nếu bạn làm điều này, bạn sẽ biết rằng có điều gì đó đáng nghi đang xảy ra khi ứng dụng SSH của bạn nói với bạn "Tính xác thực của máy khách không thể được thiết lập" hoặc khi nó cho bạn biết "Khóa chung của máy chủ đã bị thay đổi". Do đó, bạn phải luôn luôn thêm khóa chung của máy chủ vào ~/.ssh/known_hoststệp của mình trước và không bao giờ nói có khi máy khách SSH của bạn nói với bạn "Tính xác thực của máy khách không thể được thiết lập" hoặc khi nó cho bạn biết "Khóa chung của máy chủ đã được đã thay đổi ".
Utku

3
Vâng, tôi hoàn toàn biết về cách các cơ chế xem dấu vân tay SSH hoạt động, nhưng phần lớn thời gian bạn không có tùy chọn để lấy dấu vân tay qua một kênh khác. TOFU thật đáng buồn là điều tốt nhất chúng ta thường nhận được.
Savara

Có cách nào để kiểm tra tính xác thực ngay cả sau khi trả lời "có" không?
trao đổi ngày

104

Bạn có thể tạo dấu vân tay cho khóa công khai bằng cách sử dụng ssh-keygennhư vậy:

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

Ví dụ cụ thể (nếu bạn sử dụng khóa chung 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)

Phần đầu tiên (2048)là độ dài khóa tính bằng bit, phần thứ hai (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)là dấu vân tay của khóa chung và phần thứ ba là vị trí của tệp khóa công khai.


Bạn có biết cách dịch sang 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 định dạng này từ khóa chung đó không?
Kit Ho

@KitHo Tôi không chắc là tôi có hiểu câu hỏi của bạn không. Tôi đã cập nhật ví dụ, vì tôi nghĩ ssh-keygen -lfsẽ làm những gì bạn muốn.
Benjamin Oakes

5
Khi SSH vào một máy mới, thứ người ta nhìn thấy không phải là dấu vân tay pubkey của người dùng, mà là dấu vân tay pubkey của máy chủ. Vì vậy, một ví dụ tốt hơn cho bối cảnh của câu hỏi là ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Nó hiển thị dấu vân tay cũng được hiển thị trên thông tin đăng nhập SSH tới localhost.
tanius

57
Dấu vân tay của tôi ssh-keygenbáo cáo sha256. Để lấy md5dấu vân tay tôi đã chạy ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Justin C

5
(@JustinC) OpenSSH phiên bản 6.8 (tháng 3 năm 2015) và thay đổi thành SHA256, được hiển thị trong cơ sở64 thay vì hex, theo mặc định. Đối với khách hàng sử dụng ssh -o FingerprintHash=md5hoặc tương đương trong ssh_configvà trên những thứ sử dụng sshnhư thế nào scp.
dave_thndry_085

72

Dấu vân tay là MD5 trên dữ liệu nhị phân trong khóa công khai được mã hóa 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 là dấu vân tay được hiển thị khi khóa được tạo, chỉ không có dấu hai chấm tách biệt.


Tuy nhiên, nếu bạn đang xử lý dấu vân tay mà Amazon hiển thị trong bảng điều khiển Cặp khóa EC2, thật không may , đó có thể là một con thú khác . Nếu đó là chuỗi hex gồm 32 chữ số, đó là dấu vân tay khóa công khai MD5 SSH tiêu chuẩn ở trên. Nhưng nếu là 40 chữ số hex, thì đó thực sự là dấu vân tay được tính bằng cách lấy SHA1 của khóa riêng ở định dạng 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
Tôi thấy câu trả lời này hữu ích trong kịch bản sau đây. Hệ thống của bạn sử dụng SHA1 để tính toán dấu vân tay, nhưng bạn của bạn sử dụng md5. Tôi đã chia sẻ dấu vân tay là SHA1 và nó không khớp với MD5 mà hệ thống của cô ấy tạo ra. Điều này đã giúp - cảm ơn bạn! sed 's | ^ ssh-rsa | |' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | cơ sở64 -d | md5sum
Liczyrzepa

Điều này rất phù hợp để hiểu lý do tại sao dấu vân tay này sẽ không khớp với các bản ghi trong DNS SSHFP, vì chúng sử dụng các bản tóm tắt SHA-1 hoặc SHA-256.
neirbowj

1
@Liczyrzepa trường công khai có thể có hoặc không có '==' ở cuối tùy thuộc vào loại khóa và kích thước bit; an toàn hơn và IMO dễ sử dụng hơn awk '{print $2}' /path/to/keyfile.pubhoặc tương tự.
dave_thndry_085

13
Đây là câu trả lời duy nhất giải thích cách tính dấu vân tay
greuze

2
Tuy nhiên, trong Linux Mint, lệnh là:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze

13

Nếu bạn muốn kiểm tra tệp khóa SSH để xem liệu nó có giống với tệp được báo cáo là "Khóa triển khai" của github hay không, thì đây là dành cho bạn ...

Từ URL riêng tư: https://github.com/<username>/<repo_name>/sinstall/keys bạn sẽ thấy ảnh chụp màn hình từ github

Tại nhà ga:

$ 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)

Bạn sẽ nhận thấy rằng bạn nhận được cùng một dấu vân tay cho cả khóa riêng và khóa chung.

Lệnh tương tự đó có thể được kết hợp với một tính năng gọn gàng của GitHub, đó là thực tế là chúng phục vụ công khai các khóa công khai SSH của người dùng tại https://github.com/<username>.keys

Dưới đây là một lớp lót bạn có thể sử dụng để tận dụng lợi thế của nó.

$ 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

Sẽ xuất dấu vân tay cho tất cả các khóa công khai được cấu hình trên một ví dụ sshd.

Chúng sau đó có thể được đưa vào các bản ghi DNS SSHFP .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.