Bagaimana cara mengubah kunci publik ssh-keygen menjadi format yang openssl PEM_read_bio_RSA_PUBKEY () akan mengkonsumsi fungsi?

49

Saya mengalami masalah menghasilkan kunci publik yang PEM_read_bio_RSA_PUBKEY()dapat mengkonsumsi fungsi openssl . Saya terus mendapatkan kesalahan.

Jelas saya tidak bisa hanya menggunakan string ASCII dalam ssh-keygen <>.pubfile kunci seperti dalam format file SSH atau saya mungkin SubjectPublicKeyInfostruktur.

Berikut kode gen kunci: ssh-keygen -t rsa -b 1024 -C "Test Key"

Saya menemukan konverter di php di web yang akan mengubah isi kunci publik menjadi format string PEM ASCII base64. Namun fungsinya masih tidak menyukainya.

Dokumentasi Opensl menyatakan:

  1. “Fungsi RSA_PUBKEY () yang memproses kunci publik menggunakan struktur EVP_PKEY”
  2. “Fungsi RSA_PUBKEY juga memproses kunci publik RSA menggunakan struktur RSA”

Bagaimana cara mendapatkan kunci publik OpenSSH saya ke dalam salah satu format yang akan dikonsumsi fungsi OpenSSL?

PeteP
sumber
Mencari tahu ini: gunakan alat openssl saja:
PeteP
Buat kunci pribadi: openssl genrsa -out test.priv.key 2048; Output Public key dalam format yang sama (PEM?): Openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP

Jawaban:

57

BAIK!

Jadi saya masuk ke pemikiran ini, "Mudah, saya dapat ini." Ternyata ada jauh lebih banyak daripada yang saya pikir.

Jadi masalah pertama adalah bahwa (menurut halaman manual untuk OpenSSL (man 3 pem)), OpenSSL mengharapkan kunci RSA berada dalam format PKCS # 1. Jelas ini bukan yang bekerja dengan ssh-keygen. Anda memiliki dua opsi (dari mencari di sekitar).

Jika Anda memiliki OpenSSH v. 5.6 atau lebih baru (saya tidak menggunakan laptop saya), Anda dapat menjalankan ini:

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

Metode yang lebih lama untuk melakukan ini adalah memecah kunci SSH Anda menjadi berbagai komponen ( entri blog saya menemukan beberapa di antaranya menuduh OpenSSH sebagai "berpemilik", saya lebih suka menyebutnya "unik") dan kemudian menggunakan perpustakaan ASN1 untuk bertukar hal di sekitar.

Untungnya bagi Anda, seseorang menulis kode untuk melakukan ini:

https://gist.github.com/1024558

Brian Redbeard
sumber
9
The ssh-keygenMetode tampaknya bekerja pada Linux tapi tidak OS X. Mac
tutup
3
Tutup, lihat catatan di jawaban tentang versi SSH. OS X tidak mengirimkan versi terbaru OpenSSH. Jalankan perintah ssh -V.
Brian Redbeard
3
Tidak berfungsi OpenSSH_6.2p2. Apakah berhasil OpenSSH_6.6p1.
Old Pro
-mtidak bekerja untuk saya ... apa yang bekerja di sekitar?
pstanton
2
Bekerja untuk saya di mac!
Greg Hornby
18

Dengan asumsi Anda memiliki kunci pribadi SSH id_rsa, Anda dapat mengekstrak kunci publik dari itu seperti:

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

Saya menyadari OP bertanya tentang mengonversi kunci publik, jadi ini tidak cukup menjawab pertanyaan, namun saya pikir itu akan berguna bagi beberapa orang.

Perhatikan juga bahwa perintah ini menghasilkan format kunci publik PEM, yang umumnya diharapkan OpenSSL. Jawaban oleh Brian, di sisi lain, menghasilkan file dalam format RSAPublicKey, yang bukan format normal yang diharapkan oleh OpenSSL (meskipun versi kemudian dapat membacanya melalui -RSAPublicKey_inflag). Untuk mengkonversi Anda dapat melakukan ini:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
shawkinaw
sumber
Terima kasih, -pubout dari kunci privat membantu saya.
Shaun Dewberry
openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pemjuga berfungsi (yaitu input adalah format privat pem format). Jawaban yang bagus.
Johnny Wong
1
Update: jawaban Brian telah dikoreksi -m pkcs8yang terlepas dari OpenSSH orang menggunakan nama yang salah tidak menghasilkan X.509 'Kunci Publik'. Juga, sejak OpenSSH 6.5 pada 2014-01 jika pembuatnya menetapkan 'format baru' -ountuk keamanan yang lebih baik, metode ini tidak akan berfungsi, dan karena 7,8 pada 2018-08 'format baru' sekarang menjadi standar, ditto.
dave_thompson_085
11

Format yang Anda inginkan adalah ssh-keygenpanggilan apa PKCS8. Jadi perintah berikut akan menghasilkan output yang diinginkan:

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

Dari ssh-keygenhalaman manual:

-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''.
Aaron Meriwether
sumber
Yang ini sebenarnya bekerja pada Linux dan macOS.
Jay Taylor
untuk mengekstrak kunci publik yang dihasilkan setara dari kunci pribadi di OpenSSL openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd
6

Mirip dengan metode Amal Chaudhuri di bawah ini, inilah yang berhasil bagi saya. Saya perlu membuat file pem dari kunci publik ssh yang saya buat untuk klien SFTP saya (Cyberduck).

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
l3e0wu1f
sumber
ini sepertinya tidak bekerja.
outside2344
5
HANYA ini bekerja untuk kunci RSA pribadi BUKAN meminta kunci publik OP. Jadi jawaban yang salah.
Devy
3
Sebenarnya, id_rsasudah dalam format yang tepat, Anda bisa memeriksanya sendiri, hasilnya id_rsa.pem100% identik.
Miro Kropacek