मेरा ओपनएसएसएच कुंजी फिंगरप्रिंट AWS EC2 कंसोल कीपर फिंगरप्रिंट से मेल क्यों नहीं खाता है?


73

जब मैं अपनी ओपनएसएसएच सार्वजनिक कुंजी को एडब्ल्यूएस ईसी 2 में फिंगरप्रिंट को कुंजीबद्ध करता हूं, तो एडब्ल्यूएस शो से मेल नहीं खाता, जो मैं देख रहा हूं:

ssh-keygen -l -f my_key

यह एक अलग लंबाई है और अलग-अलग बाइट्स हैं।

क्यों? मुझे यकीन है कि मैंने सही कुंजी अपलोड की है।

जवाबों:


102

एडब्ल्यूएस ईसी 2 एसएसएच 2 फिंगरप्रिंट दिखाता है, न कि ओपनएसएसएच फिंगरप्रिंट सभी को उम्मीद है। यह यूआई में यह नहीं कहता है।

यह दो पूरी तरह से अलग-अलग प्रकार के उंगलियों के निशान दिखाता है, जो इस बात पर निर्भर करता है कि कुंजी AWS पर जनरेट की गई थी या डाउनलोड की गई थी या आपने अपनी सार्वजनिक कुंजी अपलोड की थी या नहीं।

उंगलियों के निशान उत्पन्न

ssh-keygen -l -f id_rsa

होगा नहीं क्या EC2 शो से मेल खाते हैं। आप ec2-fingerprint-keyकमांड के साथ फिंगरप्रिंट जेनरेट करने के लिए या तो एडब्ल्यूएस एपीआई टूल्स का उपयोग कर सकते हैं , या इसे करने के लिए ओपनएसएसएल का उपयोग कर सकते हैं।

ध्यान दें कि यदि आपने मूल रूप से AWS पर एक कुंजी उत्पन्न की है, लेकिन फिर इसे फिर से अपलोड करें (कहते हैं, किसी अन्य क्षेत्र में) तो आपको एक अलग फिंगरप्रिंट मिलेगा क्योंकि यह SSH2 RSA फिंगरप्रिंट लेगा, बजाय sha1 के यह आपके लिए कुंजियों के लिए दिखाता है AWS पर उत्पन्न।

मज़ा, हे? इस स्क्रीनशॉट में अलग-अलग उंगलियों के निशान के साथ एक ही कुंजी की दो प्रतियां हैं

उपरोक्त में, test-generatedAWS EC2 का उपयोग करके उत्पन्न किया गया था। test-generated-reuploadedनिजी कुंजी AWS से सार्वजनिक कुंजी है, जिसे ssh-keygen -yफिर से निकाला और अपलोड किया गया है। तीसरी कुंजी, test-uploadedस्थानीय स्तर पर बनाई गई कुंजी है ... लेकिन स्थानीय ssh-keygen -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

कुंजी स्थानीय रूप से उत्पन्न

आप ओपनएसएसएल का उपयोग कर सकते हैं, जैसे कि एडब्ल्यूएस मंचों पर डैनियल द्वारा दर्शाया गया है , अपलोड किए गए सार्वजनिक कुंजी (एसएसएच 2 एमडी 5) के लिए उंगलियों के निशान दिखाने के लिए एडब्ल्यूएस द्वारा उपयोग किए गए फॉर्म में फिंगरप्रिंट उत्पन्न करने के लिए, जैसे:

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

वे सार्वजनिक भाग को निजी कुंजी से निकालकर उत्पन्न किया जा सकता है और इसका उपयोग कर सकते हैं:

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

इस मामले में आपको निम्नलिखित कमांड का उपयोग करने की आवश्यकता है, यह भी डैनियल द्वारा एडब्ल्यूएस मंचों पर दिखाया गया है, निजी कुंजी के आधार पर एक sha1 हैश उत्पन्न करने के लिए:

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

डाउनलोड किए गए AWS- जेनरेट की गई निजी कुंजी / प्रमाणपत्र फ़ाइल पर। यह उन कुंजियों पर काम करेगा जिन्हें आपने ओपनएसएसएच प्रारूप में भी परिवर्तित किया है।

संदर्भ

देख:


4
इसके बारे में AWS से लापता स्पष्टता को दुखी करते हुए, वे एक संभावित सुरक्षा उल्लंघन को खोल रहे हैं जिससे चाबियाँ सत्यापित करना कठिन हो जाता है
Jaime Hablutzel

बहुत बढ़िया जवाब! प्रारंभिक sshआदेश पर, अधिक हाल के संस्करणों के साथ आपको md5 प्रारूप निर्दिष्ट करने के लिए एक -E विकल्प की आवश्यकता है ssh-keygen -E md5 -l -f id_rsa:।
रिचवेल

13

यदि आपके पास केवल सार्वजनिक कुंजी है, तो आप AWS फिंगरप्रिंट निम्नानुसार उत्पन्न कर सकते हैं:

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

2

AWS डॉक्स 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

उन लोगों के लिए जो पायथन का उपयोग कर रहे हैं

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 पायथन 2.7.13 का उपयोग करके, इस त्रुटि के साथ:ValueError: PEM encryption format not supported.
RichVel

@RichVel, मैं त्रुटि को पुन: पेश नहीं कर सकता। मैंने अभी परीक्षण किया macOS 10.12 पर homebrew python 2.7.13 का उपयोग कर एक virtualenv में, और यह ठीक काम किया। अगर मुझे अनुमान लगाना होता, तो शायद आपके लिए pycrypto की कुछ C आवश्यकताएँ पूरी नहीं होतीं। शायद यह मदद कर सकता है?
एंडी

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

AWS उपयोग किए जा रहे प्रारूप से मेल खाने वाले उपयोगकर्ता बॉब के लिए फिंगरप्रिंट प्रिंट करेगा।


0

जावा (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();
    }
  }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.