Ekstrak kunci publik / pribadi dari file PKCS12 untuk digunakan nanti di SSH-PK-Authentication

194

Saya ingin mengekstrak kunci publik dan pribadi dari PKCS#12file saya untuk digunakan nanti di SSH-Public-Key-Authentication.

Saat ini, saya menghasilkan kunci melalui ssh-keygen yang saya masukkan .ssh/authorized_key, masing-masing di sisi klien.

Di masa depan, saya ingin menggunakan kunci dari PKCS#12wadah, jadi saya harus mengekstrak kunci publik terlebih dahulu PKCS#12dan kemudian memasukkannya ke .ssh/authorized_keysfile. Apakah ada peluang untuk membuatnya berfungsi openssl? Apakah kunci dalam PKCS#12kompatibel untuk otentikasi kunci publik?

lazydaemon
sumber

Jawaban:

283

Anda dapat menggunakan perintah berikut untuk mengekstrak kunci publik / pribadi dari wadah PKCS # 12:

  • PKCS # 1 Kunci pribadi

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • Sertifikat:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    
Nilesh
sumber
7
perintahnya berfungsi, tetapi kunci Privat diekspor sebagai format PKCS1 dan saya perlu PKCS8 ... Apakah ada opsi yang saya lewatkan untuk mendapatkan ini? Misalnya, ini mengekspor '----- BEGIN RSA PRIVATE KEY -----' tapi saya perlu '----- BEGIN PRIVATE KEY -----'
edthethird
4
Untuk melakukan itu, Anda bisa mencobaopenssl rsa -in privateKey.pem -out private.pem
Francois
27
@edthethird: Untuk mendapatkan PKCS8, tambahkan flag -nodes
Christopher K.
7
Untuk mengekspor tanpa kata sandi, tambahkan -passout pass:. Itu mengharapkan parameter berada dalam bentuk pass: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas
2
@ChristopherK. Terima kasih! itu yang bagus untuk saya. menambahkan -nodeskunci ekspor dengan benar
TecHunter
85

Ini dimungkinkan dengan sedikit konversi format.

Untuk mengekstrak kunci pribadi dalam format openssh dapat menggunakan:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Untuk mengonversi kunci pribadi ke kunci publik:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Untuk mengekstrak kunci publik dalam format openssh dapat menggunakan:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8
ryanc
sumber
2
Terima kasih! Baris pertama adalah yang saya butuhkan. Hanya kuncinya, tidak terenkripsi, sehingga dapat diinstal melalui sebagian besar sistem otomatis CDN.
BTC
1
@ PhilipRego Saya pikir Anda memiliki kunci publik dan pribadi bingung. Kunci publik RSA adalah dua nilai, 'e' eksponen publik, dan 'n' modulus - keduanya disimpan di samping bagian-bagian pribadi kunci.
ryanc
17

OpenSSH tidak dapat menggunakan file PKCS # 12 di luar kotak. Seperti yang disarankan orang lain, Anda harus mengekstrak kunci pribadi dalam format PEM yang membawa Anda dari tanah OpenSSL ke OpenSSH. Solusi lain yang disebutkan di sini tidak bekerja untuk saya. Saya menggunakan OS X 10.9 Mavericks (10.9.3 saat ini) dengan utilitas "prepackaged" (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Pertama, ekstrak kunci pribadi dalam format PEM yang akan digunakan langsung oleh OpenSSH:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Saya sangat menyarankan untuk mengenkripsi kunci pribadi dengan kata sandi:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Jelas, menulis kata sandi teks biasa pada command-line juga tidak aman, jadi Anda harus menghapus perintah terakhir dari histori atau hanya memastikannya tidak sampai di sana. Kerang yang berbeda memiliki cara yang berbeda pula. Anda bisa mengawali perintah Anda dengan ruang untuk mencegahnya disimpan ke histori di Bash dan banyak shell lainnya. Berikut ini juga cara menghapus perintah dari histori di Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Atau, Anda dapat menggunakan cara berbeda untuk mengirimkan kata sandi kunci pribadi ke OpenSSL - lihat dokumentasi OpenSSL untuk argumen frasa sandi .

Kemudian, buat kunci publik OpenSSH yang dapat ditambahkan ke file Authorized_key:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
frzng
sumber
Untuk apa | openssl rsabarang itu?
Snekse
1
@Snekse itu memastikan hanya ada kunci pribadi dalam output. Dalam kasus saya, ini membuat file identitas ( ~/.ssh/id_rsa) dengan beberapa "cruft" seperti Bag Attributes tanpa `| openssl rsa`. Saya kira OpenSSH dan utilitas lain yang menggunakan file identitas dapat menangani kesalahan itu (saya belum pernah mencoba), tetapi saya hanya terbiasa menyediakan hanya data yang diperlukan dan tidak lebih, terutama jika itu adalah masalah keamanan.
frzng
1
Jawaban ini berhasil bagi saya untuk mendapatkan akses ke kunci privat PEM-format di terminal, yang dapat saya salin / tempel: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus
7

Solusi 1:

Ekstrak P12 dari jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Ekstrak PEM dari P12 dan Edit file dan pem dari file crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Ekstrak kunci dari jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Solusi 2:

Ekstrak PEM dan dienkripsiPrivateKey ke file txt```

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Dekripsi privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
Ali Alimohammadi
sumber
1
Saat menjawab pertanyaan, membantu untuk menyoroti apa perintahnya. Anda dapat melakukannya dengan menambahkan tiga backquote sebelum dan sesudah perintah sehingga `` `echo hello``` menjadi echo hello.
PatS
2

Pembaruan: Saya perhatikan bahwa jawaban saya hanyalah duplikat buruk dari pertanyaan yang dijelaskan dengan baik di https: //unix.stackexchange.com / ... oleh BryKKan

Berikut adalah kutipan darinya:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>
gvlax
sumber
3
Menambahkan beberapa penjelasan akan membuat jawaban ini lebih bermanfaat.
mx0
0

Sejauh yang saya tahu PKCS # 12 hanyalah toko kunci sertifikat / publik / swasta. Jika Anda mengekstrak kunci publik dari file PKCS # 12, OpenSSH harus dapat menggunakannya selama itu diekstraksi dalam format PEM . Anda mungkin sudah tahu bahwa Anda juga memerlukan kunci pribadi yang sesuai (juga dalam PEM ) untuk menggunakannya untuk otentikasi ssh-public-key.

sirgeorge
sumber
0

Jawaban yang diterima adalah perintah yang benar, saya hanya ingin menambahkan satu hal tambahan, ketika mengekstraksi kunci jika Anda membiarkan kata sandi PEM ( "Enter PEM pass phrase:") kosong maka kunci lengkap tidak akan diekstraksi tetapi hanya localKeyIDakan diekstraksi. Untuk mendapatkan kunci lengkap, Anda harus menentukan kata sandi PEM yang menjalankan perintah berikut.

Harap dicatat bahwa ketika datang ke Impor kata sandi, Anda dapat menentukan kata sandi yang sebenarnya "Enter Import Password:"atau membiarkan kata sandi ini kosong:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Arvind Sachdeva
sumber
1
Itu harus menjadi komentar untuk jawaban yang diterima, bukan jawabannya.
Styx