ลายนิ้วมือของปุ่ม PEM ssh


30

ฉันมีไฟล์ PEM ซึ่งเพิ่มลงใน ssh-agent กำลังทำงานอยู่:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

ฉันจะรับลายนิ้วมือของกุญแจ (ซึ่งฉันเห็นใน ssh-agent) ได้โดยตรงจากไฟล์ได้อย่างไร ฉันรู้ว่าssh-keygen -l -f some_keyใช้ได้กับคีย์ ssh "ปกติ" แต่ไม่ใช่สำหรับไฟล์ PEM

ถ้าฉันลอง ssh-keygen ในไฟล์. pem ฉันจะได้รับ:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

กุญแจนี้เริ่มต้นด้วย:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

ซึ่งตรงข้ามกับคีย์ส่วนตัว "ปกติ" ซึ่งมีลักษณะดังนี้:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.

ทำไมคุณถึงคิดว่ามันใช้ไม่ได้กับไฟล์ PEM คุณได้รับข้อผิดพลาดอะไรบ้างเมื่อลองทำ .ssh/id_rsaไฟล์ที่สร้างโดย OpenSSH ใช้ค่าเริ่มต้นทั้งหมดเป็นไฟล์พีอีเอ็ม ไพรเวตคีย์จะเข้ารหัส PEM ตามค่าเริ่มต้น ในความเป็นจริงคุณสามารถใช้คีย์ RSA ที่คุณสร้างด้วย OpenSSL โดยตรงกับ OpenSSH
Zoredache

อัปเดตคำอธิบายพร้อมเอาต์พุตจาก ssh-keygen บน. pem
ไม่ทราบ

(ล่าช้า แต่ไม่ได้ตรวจสอบ) @Zoredache: ก่อน 7.2 (ในปี 2559 หลังจาก Q นี้) ssh-keygen -lไม่สามารถอ่านไฟล์ privatekey ได้แม้ว่าการดำเนินการอื่น ๆssh-keygen(และssh*) จะทำ แต่เมื่อssh-keygen สร้างที่สำคัญมันจะเขียนทั้งสองเช่นไฟล์ privatekey id_rsa และไฟล์ publickey สอดคล้องกับการเพิ่มเช่น.pub id_rsa.pubเก่ากว่าssh-keygen -l จะลองเพิ่ม.pubชื่อไฟล์ที่คุณระบุและอ่านไฟล์ publickey
dave_thompson_085

คำตอบ:


34

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

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

จากนั้นคุณสามารถยืนยันลายนิ้วมือสาธารณะได้:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

ในบางระบบที่ใหม่กว่านี้จะพิมพ์ลายนิ้วมือของคีย์ SHA256 คุณสามารถพิมพ์ลายนิ้วมือ MD5 ของปุ่ม (แบบโคลอน) โดยใช้ตัวเลือก-E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

หรือเป็นบรรทัดคำสั่งเดียว :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

@ คำตอบของ MikeD เป็นคำตอบที่ "ถูกต้อง" สำหรับสิ่งที่ OP มองหา (และสิ่งที่ฉันกำลังมองหา) AWS จัดเตรียมลายนิ้วมือในรูปแบบที่เขาแสดงโดยมีตัวเลขสองหลักคั่นด้วยเครื่องหมายทวิภาค โซลูชันของเขา (นำมาจากหน้า AWS ที่ให้มาด้วย) จะสร้างลายนิ้วมือในแบบเดียวกันนี้เพื่อให้คุณสามารถตรวจสอบได้อย่างถูกต้อง
Mike Williamson

50

AWS ของ " การตรวจสอบลายนิ้วมือคู่กุญแจของคุณ " ให้หนึ่งซับคู่สองตัวที่แก้ปัญหาขึ้นอยู่กับวิธีการสร้างคีย์ของคุณ

หากคุณสร้างคู่กุญแจโดยใช้ AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

หรือถ้าคุณสร้างคู่กุญแจด้วยเครื่องมือของบุคคลที่สาม:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(ลายนิ้วมือ redacted ในผลลัพธ์ด้านบน)


6

ต่อไปนี้เป็นแผ่นซับเดียวที่ควรทำสิ่งที่คุณต้องการโดยไม่ต้องสร้างไฟล์พับลิกคีย์ในเครื่อง

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

สิ่งนี้ใช้สตริง bash here <<<เพื่อให้ stdin พร้อมใช้งานเป็นไฟล์ปกติ ( /dev/stdin) แทนที่จะใช้ไพพ์ที่ssh-keygenจะทำงานกับไฟล์เท่านั้น

ตั้งแต่รีลีส 7.2 ของ openssh ssh-keygenรองรับการพิมพ์ลายนิ้วมือจากอินพุตมาตรฐาน:

  • ssh-keygen (1): อนุญาตให้พิมพ์ลายนิ้วมือจากอินพุตมาตรฐานเช่น "ssh-keygen -lf -"

โปรดทราบว่าคำสั่งนี้จะแบ่งกับคีย์ส่วนตัวที่ใช้วลีรหัสผ่านและไม่ได้ใช้ตัวแทน ควรทำงานกับไฟล์ pem ที่สร้างโดย AWS หรือ OpenStack ซึ่งไม่ได้ใช้ข้อความรหัสผ่าน

ดูhttps://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdinสำหรับข้อมูลเพิ่มเติม


บันทึกย่อประจำรุ่นไม่ได้พูด แต่อ้างอิงตามแหล่งที่มาในขณะที่ 7.2 -lยังรองรับการอ่านไฟล์privatekey (แต่ไม่ใช่จาก stdin)
dave_thompson_085

2

คุณไม่ได้รับลายนิ้วมือจากไฟล์กุญแจส่วนตัว แต่จากไฟล์กุญแจสาธารณะ

ในความเป็นจริง ssh-keygen ได้บอกคุณแล้ว:

./query.pem ไม่ใช่ไฟล์กุญแจสาธารณะ

เรียกใช้กับครึ่งสาธารณะของคีย์และควรทำงาน

พูดโดยทั่วไปมากกว่า

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

เมื่อคุณมีพับลิกคีย์กระบวนการจะตรวจสอบว่าไคลเอ็นต์มีการพักครึ่งไพรเวตที่สอดคล้องกัน เนื่องจากคุณทราบว่าแป้นใดที่คุณพยายามยืนยันคุณไม่จำเป็นต้องใช้ลายนิ้วมือ


ปัญหาคือฉันไม่มีคีย์สาธารณะสำหรับไพรเวทส่วนตัวนี้ :( และอีกอย่างssh-keygenทำงานกับไฟล์คีย์ส่วนตัวของ RSA ที่มีข้อมูลเพิ่มเติมตอนเริ่มต้น (ดูโพสต์เริ่มต้นของฉัน) แต่ไม่ใช่ที่นี่ .
ไม่ทราบ

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

3
นั่นไม่ถูกต้อง ในฐานะที่ @ominug ชี้ให้เห็นข้างต้นssh-keygen -yfทำสิ่งนี้
Steve Bennett

4
@Stephane ในขณะที่ถูกต้องในระดับ RSA บริสุทธิ์ในทางปฏิบัติวิธีการจัดเก็บคีย์ใน PKCS ระบุรูปแบบสำหรับคีย์ส่วนตัวรวมทั้งกุญแจจริง ๆ แล้ว เปรียบเทียบรายละเอียดสำหรับส่วนตัวกับสาธารณะ
Håkan Lindqvist

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