ทำไมลายนิ้วมือกุญแจ OpenSSH ของฉันไม่ตรงกับลายนิ้วมือคู่คีย์คอนโซล AWS EC2


73

เมื่อฉันนำเข้ากุญแจสาธารณะ OpenSSH ของฉันไปที่พวงกุญแจของ AWS EC2 ลายนิ้วมือที่ AWS แสดงไม่ตรงกับที่ฉันเห็นจาก:

ssh-keygen -l -f my_key

มันมีความยาวต่างกันและมีไบต์ต่างกัน

ทำไม? ฉันแน่ใจว่าฉันอัปโหลดคีย์ที่ถูกต้อง

คำตอบ:


102

AWS EC2 แสดงลายนิ้วมือ SSH2 ไม่ใช่ลายนิ้วมือ OpenSSH ที่ทุกคนคาดหวัง ไม่ได้พูดแบบนี้ใน UI

นอกจากนี้ยังแสดงลายนิ้วมือที่แตกต่างกันสองประเภทโดยขึ้นอยู่กับว่าคีย์นั้นสร้างขึ้นบน AWS และดาวน์โหลดหรือว่าคุณอัปโหลดกุญแจสาธารณะของคุณเองหรือไม่

ลายนิ้วมือที่สร้างขึ้นด้วย

ssh-keygen -l -f id_rsa

จะไม่ตรงกับที่ EC2 แสดง คุณสามารถใช้เครื่องมือ AWS API เพื่อสร้างลายนิ้วมือด้วยec2-fingerprint-keyคำสั่งหรือใช้ OpenSSL เพื่อทำมัน

โปรดทราบว่าหากคุณสร้างรหัสบน AWS แต่แรกแล้วอัปโหลดอีกครั้ง (พูดไปยังภูมิภาคอื่น) จากนั้นคุณจะได้รับลายนิ้วมือที่แตกต่างกันเพราะจะใช้ลายนิ้วมือ SSH2 RSA แทน sha1 จะแสดงกุญแจให้คุณ สร้างขึ้นบน AWS

เฮ้เฮ้ สกรีนช็อตนี้มีสำเนาของคีย์เดียวกันสองชุดซึ่งมีลายนิ้วมือแตกต่างกัน

ในข้างต้นtest-generatedถูกสร้างขึ้นโดยใช้ AWS EC2 test-generated-reuploadedเป็นกุญแจสาธารณะจากคีย์ส่วนตัว AWS ที่สร้างแยกssh-keygen -yและอัพโหลดอีกครั้ง คีย์ที่สามtest-uploadedเป็นคีย์ที่สร้างขึ้นในประเทศ ... แต่ท้องถิ่นลายนิ้วมือssh-keygen -lb2: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

กุญแจที่สร้างขึ้นในเครื่อง

คุณสามารถใช้ OpenSSL ซึ่งแสดงโดย Daniel บนฟอรัม AWSเพื่อสร้างลายนิ้วมือในแบบฟอร์มที่ AWS ใช้เพื่อแสดงลายนิ้วมือสำหรับกุญแจสาธารณะที่อัปโหลด (SSH2 MD5) เช่น:

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

พวกเขาสามารถสร้างขึ้นโดยการแยกส่วนสาธารณะจากคีย์ส่วนตัวและ hashing มันโดยใช้:

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

กุญแจที่สร้างขึ้นบน AWS

หากคีย์ลายนิ้วมือที่แสดงบนคอนโซล AWS นั้นยาวกว่านั้นจะเป็นรหัสส่วนตัวที่สร้างขึ้นบน AWS เช่น:

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

ในกรณีนี้คุณต้องใช้คำสั่งต่อไปนี้ซึ่งแสดงโดย Daniel บนฟอรัม AWS เพื่อสร้างแฮช sha1 ตามคีย์ส่วนตัว:

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

บนไฟล์คีย์ส่วนตัว / ใบรับรองที่สร้างโดย AWS ที่ดาวน์โหลด มันจะทำงานกับปุ่มที่คุณแปลงเป็นรูปแบบ OpenSSH ด้วย

อ้างอิง

ดู:


4
เศร้าความชัดเจนที่ขาดหายไปจาก AWS เกี่ยวกับมันพวกเขากำลังเปิดช่องโหว่ด้านความปลอดภัยที่อาจเกิดขึ้นทำให้ยากต่อการตรวจสอบคีย์
Jaime Hablutzel

คำตอบที่ดี! ในการเริ่มต้นsshคำสั่งกับรุ่นล่าสุดคุณจำเป็นต้องมีตัวเลือก -E เพื่อระบุรูปแบบ ssh-keygen -E md5 -l -f id_rsamd5:
RichVel

14

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

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

2

มีทรัพยากรใน AWS docs http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

หากคุณสร้างคู่คีย์ของคุณโดยใช้ AWS คุณสามารถใช้เครื่องมือ OpenSSL เพื่อสร้างลายนิ้วมือจากไฟล์กุญแจส่วนตัว:

สำเนา

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

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

สำเนา

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

ผลลัพธ์ควรตรงกับลายนิ้วมือที่แสดงในคอนโซล


2

นี่คือสิ่งที่ฉันใช้:

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}'

สิ่งนี้สร้างลายนิ้วมือจากกุญแจสาธารณะคล้ายกับบางอย่างที่กล่าวมา


1

สำหรับพวกเราที่ใช้ 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]))

น่าเสียดายที่สิ่งนี้ล้มเหลวสำหรับฉันใน macOS 10.11 โดยใช้ Homebrew Python 2.7.13 ล่าสุดโดยมีข้อผิดพลาดนี้:ValueError: PEM encryption format not supported.
RichVel

@RichVel ฉันไม่สามารถทำซ้ำข้อผิดพลาด ฉันเพิ่งทดสอบอยู่ใน macOS 10.12 โดยใช้ homebrew python 2.7.13 ใน virtualenv และมันใช้งานได้ดี ถ้าฉันต้องเดาบางทีข้อกำหนด C สำหรับ pycrypto อาจไม่ตรงกับคุณ บางทีนี่อาจช่วยได้?
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

นี่คือสคริปต์ที่ฉันใช้เพิ่มเส้นทางสคริปต์เพื่อ env ขอบคุณ J.Doe สำหรับคำตอบ


0

ในกรณีนี้อาจมีประโยชน์: https://ssh-vault.com/post/fingerprint/

ตัวอย่างเช่น:

$ ssh-vault -u bob -f

จะพิมพ์ลายนิ้วมือสำหรับผู้ใช้ Bob ที่ตรงกับรูปแบบที่ AWS ใช้อยู่


0

Java (ใช้ BouncyCastle) หากคอนโซล AWS แสดงปุ่มที่สั้นกว่าให้ลองใช้ MD5 (SHA1: 20 ไบต์, MD5: 16 ไบต์)

  /**
   * @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();
    }
  }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.