Tại sao dấu vân tay khóa OpenSSH của tôi không khớp với dấu vân tay của bàn điều khiển AWS EC2?


73

Khi tôi nhập khóa công khai OpenSSH của mình vào khóa AWS EC2, dấu vân tay mà AWS hiển thị không khớp với những gì tôi thấy từ:

ssh-keygen -l -f my_key

Nó có độ dài khác nhau và có các byte khác nhau.

Tại sao? Tôi chắc chắn tôi đã tải lên khóa chính xác.

Câu trả lời:


102

AWS EC2 hiển thị dấu vân tay SSH2, không phải dấu vân tay OpenSSH mà mọi người mong đợi. Nó không nói điều này trong UI.

Nó cũng hiển thị hai loại dấu vân tay hoàn toàn khác nhau tùy thuộc vào việc khóa được tạo trên AWS và được tải xuống hay bạn đã tải lên khóa chung của riêng mình.

Dấu vân tay được tạo bằng

ssh-keygen -l -f id_rsa

sẽ không khớp với những gì EC2 thể hiện. Bạn có thể sử dụng các công cụ API AWS để tạo dấu vân tay bằng ec2-fingerprint-keylệnh hoặc sử dụng OpenSSL để thực hiện.

Lưu ý rằng nếu ban đầu bạn đã tạo một khóa trên AWS, nhưng sau đó đã tải lại nó (giả sử sang một khu vực khác) thì bạn sẽ nhận được một dấu vân tay khác vì nó sẽ lấy dấu vân tay SSH2 RSA, thay vì sha1 mà nó hiển thị cho các khóa của bạn được tạo trên AWS.

Vui không Ảnh chụp màn hình này có hai bản sao của cùng một khóa với dấu vân tay khác nhau

Ở trên, test-generatedđã được tạo bằng AWS EC2. test-generated-reuploadedlà khóa chung từ khóa riêng AWS được tạo, trích xuất ssh-keygen -yvà tải lên lại. Khóa thứ ba test-uploaded, là khóa được tạo cục bộ ... nhưng ssh-keygen -ldấu vân tay cục bộ là b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea.

$ ssh-keygen -l -f theprivatekey
2048 b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea
$ openssl pkey -in theprivatekey -pubout -outform DER | openssl md5 -c
Enter pass phrase for id_landp:
(stdin)= 91:bc:58:1f:ea:5d:51:2d:83:d3:6b:d7:6d:63:06:d2

Khóa được tạo cục bộ

Bạn có thể sử dụng OpenSSL, như được Daniel thể hiện trên các diễn đàn AWS , để tạo dấu vân tay ở dạng được AWS sử dụng để hiển thị dấu vân tay cho các khóa công khai được tải lên (SSH2 MD5), như:

7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0

Chúng có thể được tạo bằng cách trích xuất phần chung từ khóa riêng và băm nó bằng cách sử dụng:

openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c

Khóa được tạo trên AWS

Nếu dấu vân tay khóa hiển thị trên bảng điều khiển AWS dài hơn thì đó là khóa riêng được tạo trên AWS, như:

ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a

Trong trường hợp này, bạn cần sử dụng lệnh sau, cũng được Daniel hiển thị trên các diễn đàn AWS, để tạo ra hàm băm sha1 dựa trên khóa riêng:

openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c

trên tệp chứng chỉ / khóa riêng do AWS tạo. Nó cũng sẽ hoạt động trên các khóa bạn đã chuyển đổi sang định dạng OpenSSH.

Người giới thiệu

Xem:


4
Đáng buồn là sự thiếu rõ ràng từ AWS về điều đó, họ đang mở một vi phạm bảo mật tiềm ẩn khiến việc xác minh khóa trở nên khó khăn hơn
Jaime Hablutzel

Câu trả lời chính xác! Trên sshlệnh ban đầu , với các phiên bản gần đây hơn, bạn cần tùy chọn -E để chỉ định định dạng md5 : ssh-keygen -E md5 -l -f id_rsa.
RichVel

14

Nếu bạn chỉ có khóa chung, bạn có thể tạo dấu vân tay AWS như sau:

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c

2

Có tài nguyên trên tài liệu AWS http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key- Pair-fingerprints

Nếu bạn đã tạo cặp khóa của mình bằng AWS, bạn có thể sử dụng các công cụ OpenSSL để tạo dấu vân tay từ tệp khóa riêng:

Sao chép

$ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

Nếu bạn đã tạo cặp khóa của mình bằng công cụ của bên thứ ba và tải khóa công khai lên AWS, bạn có thể sử dụng các công cụ OpenSSL để tạo dấu vân tay từ tệp khóa riêng trên máy cục bộ của mình:

Sao chép

$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c

Đầu ra phải khớp với dấu vân tay được hiển thị trong bảng điều khiển.


2

Đây là những gì tôi sử dụng:

openssl rsa -RSAPublicKey_in -in <(ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM) -inform PEM -outform DER 2>/dev/null | openssl md5 -c | awk '{print $2}'

Điều này tạo ra dấu vân tay từ khóa chung, tương tự như một số ở trên.


1

Đối với những người trong chúng ta sử dụng Python

from Crypto.PublicKey import RSA
import hashlib
import base64

#Load your key from disk, or a string, or generate.
my_key = RSA.importKey(open(my_rsa_private_key, 'r').read())

# Normal md5 fingerprint
fp_plain = hashlib.md5(base64.b64decode(my_key.exportKey('OpenSSH').strip().split()[1].encode('ascii'))).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))

#AWS' EC2 fingerprint
public_only_key = RSA.importKey(my_key.exportKey('OpenSSH'))
fp_plain = hashlib.md5(public_only_key.exportKey('DER')).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))

Thật không may, điều này đã thất bại với tôi trên macOS 10.11 khi sử dụng Python Homebrew 2.7.13 mới nhất, với lỗi này:ValueError: PEM encryption format not supported.
RichVel

@RichVel, tôi không thể tái tạo lỗi. Tôi vừa thử nghiệm trên macOS 10.12 bằng cách sử dụng python homebrew 2.7.13 trong virtualenv và nó hoạt động rất tốt. Nếu tôi phải đoán, có thể một số yêu cầu C đối với pycrypto không được đáp ứng cho bạn. Có lẽ điều này có thể giúp đỡ?
Andy

1
#!/bin/bash
key_file=$1
if [[ -n $key_pub_file ]]; then
    ssh-keygen -e -f $key_pub_file -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
else
    echo "pass the pub file as argument"
fi

Đây là một kịch bản mà tôi sử dụng, thêm đường dẫn kịch bản vào env. Cảm ơn J.Doe đã trả lời



0

Java (sử dụng BouncyCastle). Nếu bảng điều khiển AWS hiển thị các phím ngắn hơn, hãy thử với MD5. (SHA1: 20 byte, MD5: 16 byte).

  /**
   * @return the SHA1 digest of the DER encoded RSA private key, e.g. 16:61:7d:1c:e7:d1:3b:93:b6:81:bf:64:7a:a0:38:fa:b6:6c:9e:e4
   */
  private String getAwsFingerprint(File rsaPrivateKeyFileFromAws) throws Exception {
    try(FileReader reader = new FileReader(rsaPrivateKeyFileFromAws)) {
      java.security.KeyPair keyPair = new JcaPEMKeyConverter().getKeyPair((PEMKeyPair) new PEMParser(reader).readObject());
      String hex = Hex.toHexString(MessageDigest.getInstance("SHA1").digest(keyPair.getPrivate().getEncoded()));
      StringBuilder sb = new StringBuilder();
      for(int i = 0; i < hex.length();) {
        sb.append(hex.charAt(i++));
        sb.append(hex.charAt(i++));
        sb.append(i % 2 == 0 && i != hex.length() ? ":" : "");
      }
      return sb.toString();
    }
  }
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.