การแปลงใบรับรอง PKCS # 12 เป็น PEM โดยใช้ OpenSSL


212

ฉันมี x64 OpenSSL บน Windows 7 ซึ่งผมดาวน์โหลดได้จากOpenSSL สำหรับหน้าต่างบน Google Code ฉันพยายามที่จะเรียกใช้:

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

แต่ฉันได้รับข้อผิดพลาด

unable to load private key

ฉันจะแยกใบรับรองใน PEM จากร้านค้า PKCS # 12 โดยใช้ OpenSSL ได้อย่างไร


@ jww ฉันคิดว่าคำถามนี้มีอายุเกิน 3 ปีแล้วซึ่งค่อนข้างช้าที่จะส่งสัญญาณธงนอกหัวข้อ
Dean MacGregor

เป็นทางการเพื่อให้คนรู้นอกหัวข้อ ผู้คนกำลังถามคำถามนอกหัวข้อเดียวกันและอ้างถึงคำถามนี้ หากผู้คนไม่ได้รับการบอกกล่าวนอกหัวข้อพวกเขาจะยังคงถามเกี่ยวกับ Stack Overflow ต่อไป
jww

2
@jww คำตอบที่ลงคะแนนสูงสุดสำหรับคำถามเมตาที่คุณลิงก์ระบุว่า "ควรอนุญาตให้ใช้คำถาม DevOps ใน Stack Overflow" ฉันจะอัปโหลดเพราะคำตอบตรงตามความต้องการของฉัน (แม้ว่าสำหรับฉันฉันไม่ได้เขียนโปรแกรมฉันสามารถรวมคำตอบไว้ในโปรแกรมถ้าฉันต้องการ)
dcorking

คำตอบ:


536

ลอง:

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

หลังจากนั้นคุณ:

  • ใบรับรองใน newfile.crt.pem
  • คีย์ส่วนตัวใน newfile.key.pem

หากต้องการวางใบรับรองและคีย์ในไฟล์เดียวกันให้ใช้วิธีต่อไปนี้

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

หากคุณต้องการป้อนรหัสผ่าน PKCS # 12 โดยตรงจากบรรทัดคำสั่ง (เช่นสคริปต์) เพียงเพิ่ม-passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
เป็นไปได้ไหมว่ารหัสส่วนตัวและใบรับรองจะถูกจัดเก็บในไฟล์ * .pem เดียวกัน?
Ramis

18
ใช่มันคือ:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee

2
ขอรหัสผ่านนำเข้า นั่นคืออะไร ?
Saurabh Chandra Patel

4
@SaurabhChandraPatel คุณต้องรู้รหัสผ่านสำหรับใบรับรองของคุณ นี่ไม่ใช่วิธีการกู้คืนรหัสผ่านที่ถูกลืม
Dean MacGregor

2
หากไม่ใช้ -node คีย์ส่วนตัวจะไม่ถูกดึงออกมา
Meixner

22

คุณต้องระบุรหัสผ่าน คุณสามารถทำได้ภายในบรรทัดคำสั่งเดียวกันด้วยไวยากรณ์ต่อไปนี้:

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

จากนั้นคุณจะได้รับแจ้งให้ใส่รหัสผ่านเพื่อเข้ารหัสคีย์ส่วนตัวในไฟล์เอาต์พุตของคุณ รวมตัวเลือก "nodes" ในบรรทัดด้านบนหากคุณต้องการส่งออกคีย์ส่วนตัวที่ไม่ได้เข้ารหัส (ข้อความธรรมดา):

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

ข้อมูลเพิ่มเติม: http://www.openssl.org/docs/apps/pkcs12.html


16

หากคุณสามารถใช้ Python ได้ง่ายยิ่งขึ้นถ้าคุณมีpyopensslโมดูล นี่มันคือ:

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())

มีเหตุผลที่จะเปิดไฟล์ที่ใช้fileและไม่open? ผมแค่อยากจะเข้าใจว่ามันเป็นฉันจะใช้มันในอนาคต (เพื่อลดความซับซ้อนของฉัน openssh แก้ปัญหาโทรเป็นคำสั่ง)
ม.ค. Vlcinsky

ไม่ไม่แตกต่างกัน open("push.p12", 'rb').read()คุณก็สามารถทำ
KVISH

2
หากใช้ python 3 คุณอาจต้องการเขียนเนื้อหาลงไฟล์: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))เพื่อเขียนใบรับรองและwith open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))สำหรับรหัส
Adam Parkin

ฉันใช้ python 3.7 เมื่อใช้งานตัวอย่างด้านบนฉันได้รับสิ่งต่อไปนี้: "TypeError: initializer สำหรับ ctype 'char' จะต้องมีความยาว 1 ไบต์ไม่ใช่ str" มีบางอย่างผิดปกติกับรหัสผ่านของฉัน
getaglow

เหตุใดจึงเป็น "ง่ายยิ่งขึ้น" ในการสร้างไฟล์ป้อนรหัสบันทึกและเรียกใช้ - แทนที่จะเพียงแค่เรียกใช้คำสั่งเดียว?
Torben Gundtofte-Bruun

3

ฉันมีไฟล์ PFX และจำเป็นต้องสร้างไฟล์ KEY สำหรับ NGINX ดังนั้นฉันจึงทำสิ่งนี้:

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

-----BEGIN PRIVATE KEY-----แล้วผมต้องแก้ไขไฟล์ที่สำคัญและลบเนื้อหาทั้งหมดขึ้นอยู่กับ หลังจากนั้น NGINX ก็ยอมรับไฟล์ KEY


0

หากคุณต้องการไฟล์พีอีเอ็มโดยไม่ต้องใช้รหัสผ่านใด ๆ ที่คุณสามารถใช้นี้วิธีการแก้ปัญหา

เพียงคัดลอกและวางรหัสส่วนตัวและใบรับรองไปยังไฟล์เดียวกันและบันทึกเป็น. pem

ไฟล์จะมีลักษณะดังนี้:

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

นั่นเป็นวิธีเดียวที่ฉันพบว่าการอัปโหลดใบรับรองไปยังอุปกรณ์ Cisco สำหรับ HTTPS

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