ฉันจะแปลงคีย์สาธารณะ ssh-keygen เป็นรูปแบบที่ openssl PEM_read_bio_RSA_PUBKEY () ฟังก์ชันจะใช้งานได้อย่างไร


49

ฉันมีปัญหาในการสร้างรหัสสาธารณะที่PEM_read_bio_RSA_PUBKEY()ฟังก์ชั่นopenssl สามารถใช้งานได้ ฉันได้รับข้อผิดพลาด

เห็นได้ชัดว่าฉันไม่สามารถใช้สตริง ASCII ในssh-keygen <>.pubไฟล์คีย์ได้เนื่องจากอยู่ในรูปแบบไฟล์ SSH หรืออาจเป็นSubjectPublicKeyInfoโครงสร้างก็ได้

นี่คือรหัส gen ที่สำคัญ: ssh-keygen -t rsa -b 1024 -C "Test Key"

ฉันพบตัวแปลงใน php บนเว็บซึ่งจะแปลงเนื้อหาของกุญแจสาธารณะให้เป็นรูปแบบสตริง base64 PEM ASCII อย่างไรก็ตามฟังก์ชั่นยังคงไม่ชอบ

สถานะเอกสารประกอบของ Openssl:

  1. “ RSA_PUBKEY () ฟังก์ชั่นที่ประมวลผลรหัสสาธารณะโดยใช้โครงสร้าง EVP_PKEY”
  2. “ ฟังก์ชั่น RSA_PUBKEY ยังประมวลผลคีย์สาธารณะ RSA โดยใช้โครงสร้าง RSA”

ฉันจะทำให้กุญแจสาธารณะ OpenSSH ของฉันเป็นรูปแบบใดก็ได้ที่ฟังก์ชั่น OpenSSL จะใช้มัน?


คิดออกนี้: ใช้เครื่องมือ openssl เท่านั้นเช่น:
PeteP

สร้างคีย์ส่วนตัว: openssl genrsa -out test.priv.key 2048; เอาท์พุทคีย์สาธารณะในรูปแบบเดียวกัน (PEM?): openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP

คำตอบ:


56

ตกลง!

ดังนั้นฉันจึงเดินเข้าไปในความคิดนี้ "ง่ายฉันได้รับสิ่งนี้" ปรากฎว่ามันมีอะไรมากมายมากกว่าที่ฉันคิด

ดังนั้นประเด็นแรกคือ (ตามหน้า man สำหรับ OpenSSL (man 3 pem)) OpenSSL คาดว่าคีย์ RSA จะอยู่ในรูปแบบ PKCS # 1 เห็นได้ชัดว่านี่ไม่ใช่สิ่งที่ ssh-keygen ใช้งานได้ คุณมีสองตัวเลือก (จากการค้นหารอบ ๆ )

หากคุณมี OpenSSH เวอร์ชัน 5.6 หรือใหม่กว่า (ฉันไม่ได้ใช้แล็ปท็อป) คุณสามารถเรียกใช้สิ่งนี้:

ssh-keygen -f key.pub -e -m pem

วิธีที่ยาวกว่าในการทำเช่นนี้คือการแยกกุญแจ SSH ของคุณออกเป็นส่วนประกอบต่าง ๆ ( รายการบล็อกที่ฉันพบบางอย่างนี้กล่าวหาว่า OpenSSH ว่าเป็น "กรรมสิทธิ์" ฉันชอบเรียกว่า "ไม่เหมือนใคร") แล้วใช้ไลบรารี ASN1 เพื่อสลับสิ่งต่าง ๆ รอบ ๆ

โชคดีสำหรับคุณมีคนเขียนรหัสเพื่อทำสิ่งนี้:

https://gist.github.com/1024558


9
ssh-keygenวิธีดูเหมือนว่าจะทำงานบนลินุกซ์ แต่ไม่ Mac OS X.
ฝา

3
ฝาปิดดูบันทึกย่อในคำตอบเกี่ยวกับรุ่น SSH OS X ไม่ได้จัดส่ง OpenSSH เวอร์ชันล่าสุด ssh -Vเรียกใช้คำสั่ง
Brian Redbeard

3
OpenSSH_6.2p2ไม่ทำงานใน OpenSSH_6.6p1ไม่ทำงานใน
โปรเก่า

-mไม่ได้ผลสำหรับฉัน ... อะไรคือสิ่งที่ต้องแก้ไข
pstanton

2
ใช้งานได้สำหรับฉันบน mac!
Greg Hornby

18

สมมติว่าคุณมีคีย์ส่วนตัว SSH id_rsaคุณสามารถแยกกุญแจสาธารณะออกได้โดยทำดังนี้

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

ฉันรู้ว่า OP ถามเกี่ยวกับการแปลงรหัสสาธารณะดังนั้นนี่จึงไม่ค่อยตอบคำถาม แต่ฉันคิดว่ามันจะมีประโยชน์สำหรับบางคน

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

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem

ขอบคุณการ -pubout จากคีย์ส่วนตัวทำให้ฉัน
Shaun Dewberry

openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemยังใช้งานได้ (เช่นอินพุตคือกุญแจส่วนตัวในรูปแบบ pem) คำตอบที่ดี.
Johnny Wong

1
อัปเดต: คำตอบของ Brian ได้รับการแก้ไข-m pkcs8ซึ่งแม้จะมีคน OpenSSH ที่ใช้ชื่อที่ไม่ถูกต้องก็จะสร้าง X.509 'PUBKEY' นอกจากนี้ตั้งแต่ OpenSSH 6.5 ใน 2014-01 หากผู้สร้างระบุ 'รูปแบบใหม่' -oเพื่อความปลอดภัยที่ดีกว่าวิธีนี้จะไม่ทำงานและเนื่องจาก 7.8 ใน 2018-08 'รูปแบบใหม่' เป็นค่าเริ่มต้นเช่นเดียวกัน
dave_thompson_085

11

รูปแบบที่คุณต้องการคือสิ่งที่เรียกว่าssh-keygen PKCS8ดังนั้นคำสั่งต่อไปนี้จะสร้างผลลัพธ์ที่ต้องการ:

ssh-keygen -f key.pub -e -m pkcs8

จากssh-keygenหน้าคน:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.

อันนี้ใช้ได้ทั้งบน Linux และ macOS
Jay Taylor

เพื่อแยกคีย์สาธารณะที่สร้างขึ้นจากคีย์ส่วนตัวใน OpenSSL openssl rsa -in คีย์ -pubout -out key.pub.openssl.pkcs8
Mohannd

6

คล้ายกับวิธีของ Amal Chaudhuri ด้านล่างนี่คือสิ่งที่ใช้ได้กับฉัน ฉันต้องการสร้างไฟล์ pem จากกุญแจสาธารณะของ ssh ที่ฉันสร้างขึ้นสำหรับไคลเอนต์ SFTP ของฉัน (Cyberduck)

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem

ดูเหมือนจะใช้งานไม่ได้
นอก 2344

5
ใช้งานได้กับคีย์ RSA ส่วนตัวเท่านั้นไม่อนุญาตให้พับลิกคีย์ OP คำตอบที่ผิดดังนั้น
Devy

3
ที่จริงid_rsaแล้วอยู่ในรูปแบบที่ถูกต้องคุณสามารถตรวจสอบด้วยตัวเองผลที่ได้id_rsa.pemคือเหมือนกัน 100%
Miro Kropacek

-2

อีกวิธีในการทำเช่นนี้จากเว็บไซต์อื่น การโพสต์สิ่งนี้ในกรณีที่คุณต้องการวิธีอื่น ทำงานได้ดีมาก http://www.chatur.com.np/2011/01/convert-openssh-rsa-key-to-pem-format.html

openssl dsa -in ~/.ssh/id_dsa -outform pem > id_dsa.pem

วิธีการนั้นดูเหมือนจะใช้งานไม่ได้จริง
ฌอน

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