Mengubah sertifikat PKCS # 12 menjadi PEM menggunakan OpenSSL

212

Saya memiliki OpenSSL x64 di Windows 7 yang saya unduh dari openssl-for-windows di Google Code . Saya mencoba menjalankan:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

tapi saya mendapatkan kesalahan.

unable to load private key

Bagaimana cara mengekstrak sertifikat di PEM dari toko PKCS # 12 menggunakan OpenSSL?

Dean MacGregor
sumber
@ jww Saya pikir mengingat bahwa pertanyaan ini sudah lebih dari 3 tahun sehingga agak terlambat untuk memberi tanda pada bendera di luar topik.
Dean MacGregor
Hanya formalitas sehingga orang tahu di luar topik. Orang-orang menanyakan pertanyaan di luar topik yang sama, dan mengutip pertanyaan ini. Jika orang tidak diberi tahu topiknya di luar, maka mereka akan terus bertanya di Stack Overflow.
jww
2
@jww jawaban tertinggi pada meta pertanyaan yang Anda tautkan mengatakan, "Pertanyaan DevOps harus diizinkan di Stack Overflow." Saya akan merasa senang, karena jawabannya memenuhi kebutuhan saya (walaupun, bagi saya, saya tidak pemrograman, saya bisa dengan mudah memasukkan jawaban dalam sebuah program jika saya mau)
dcorking

Jawaban:

534

Mencoba:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

Setelah itu Anda memiliki:

  • sertifikat di newfile.crt.pem
  • kunci pribadi di newfile.key.pem

Untuk memasukkan sertifikat dan kunci dalam file yang sama gunakan yang berikut ini

openssl pkcs12 -in path.p12 -out newfile.pem

Jika Anda perlu memasukkan kata sandi PKCS # 12 langsung dari baris perintah (misalnya skrip), cukup tambahkan -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'
kmx
sumber
2
Apakah mungkin kunci pribadi dan sertifikat akan disimpan dalam file * .pem yang sama?
Ramis
18
ya, itu adalah:openssl pkcs12 -in path.p12 -out newfile.pem
Wah,
2
meminta Impor Kata Sandi. apa itu ?
Saurabh Chandra Patel
4
@SaurabhChandraPatel Anda harus mengetahui kata sandi untuk sertifikat Anda. Ini bukan cara untuk memulihkan kata sandi yang terlupakan
Dean MacGregor
2
menghilangkan -nodes, kunci pribadi tidak bisa diekstraksi.
Meixner
22

Anda hanya perlu memberikan kata sandi. Anda bisa melakukannya dalam baris perintah yang sama dengan sintaks berikut:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

Anda kemudian akan diminta kata sandi untuk mengenkripsi kunci pribadi di file output Anda. Sertakan opsi "node" di baris di atas jika Anda ingin mengekspor kunci pribadi yang tidak dienkripsi (plaintext):

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

Info lebih lanjut: http://www.openssl.org/docs/apps/pkcs12.html

Colin
sumber
16

Jika Anda dapat menggunakan Python, akan lebih mudah jika Anda memiliki pyopensslmodul. Ini dia:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
KVISH
sumber
Apakah ada alasan untuk membuka file menggunakan filedan tidak open? Saya hanya ingin memahaminya karena saya akan menggunakannya di masa depan (untuk menyederhanakan solusi saya memanggil openssh sebagai perintah)
Jan Vlcinsky
Tidak, tidak ada perbedaan. Anda bisa melakukannya open("push.p12", 'rb').read().
KVISH
2
Jika menggunakan python 3 Anda mungkin ingin menulis konten ke file: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))untuk menulis sertifikat dan with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))untuk kunci.
Adam Parkin
Saya menggunakan python 3.7, ketika menjalankan contoh di atas, saya mendapatkan yang berikut: "TypeError: initializer untuk ctype 'char' harus berukuran byte 1, bukan str" Apakah ada yang salah dengan kata sandi saya
getaglow
Mengapa "lebih mudah" untuk membuat file, memasukkan kode, menyimpannya, dan menjalankannya - daripada hanya menjalankan satu perintah?
Torben Gundtofte-Bruun
3

Saya punya file PFX dan perlu membuat file KUNCI untuk NGINX, jadi saya melakukan ini:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

Kemudian saya harus mengedit file KUNCI dan menghapus semua konten hingga -----BEGIN PRIVATE KEY-----. Setelah itu NGINX menerima file KEY.

KTCO
sumber
0

Jika Anda memerlukan file PEM tanpa kata sandi, Anda dapat menggunakan solusi ini .

Cukup salin dan tempel kunci pribadi dan sertifikat ke file yang sama dan simpan sebagai .pem.

File akan terlihat seperti:

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

Itulah satu-satunya cara saya menemukan untuk mengunggah sertifikat ke perangkat Cisco untuk HTTPS.

kamu
sumber