แยกพับลิกคีย์ / ไพรเวตจากไฟล์ PKCS12 เพื่อใช้ในภายหลังใน SSH-PK-Authentication


194

ฉันต้องการแยกกุญแจสาธารณะและกุญแจส่วนตัวจากPKCS#12ไฟล์ของฉันเพื่อใช้ในภายหลังใน SSH-Public-Key-Authentication

ตอนนี้ฉันกำลังสร้างกุญแจผ่าน ssh-keygen ที่ฉันใส่ลงไป.ssh/authorized_keyตามลำดับที่ด้านลูกค้า

ในอนาคตฉันต้องการใช้กุญแจจากที่PKCS#12เก็บดังนั้นฉันจะแยกกุญแจสาธารณะก่อนจากPKCS#12นั้นจึงใส่มันลงใน.ssh/authorized_keysไฟล์ มีโอกาสที่จะได้งานนี้ผ่านopenssl? คีย์ที่PKCS#12ใช้ร่วมกันได้สำหรับการพิสูจน์ตัวตนแบบ ssh-public-key หรือไม่?

คำตอบ:


284

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อแยกคีย์สาธารณะ / ส่วนตัวจากคอนเทนเนอร์ PKCS # 12:

  • PKCS # 1 คีย์ส่วนตัว

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • ใบรับรอง:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    

7
คำสั่งใช้งานได้ แต่รหัสส่วนตัวจะถูกส่งออกเป็นรูปแบบ PKCS1 และฉันต้องการ PKCS8 ... มีตัวเลือกใดที่ฉันขาดหายไปหรือไม่ ตัวอย่างเช่นมันส่งออก '----- BEGIN RSA PRIVATE KEY -----' แต่ฉันต้องการ '----- BEGIN PRIVATE KEY -----'
edthethird

4
ในการทำเช่นนั้นคุณสามารถลองได้openssl rsa -in privateKey.pem -out private.pem
Francois

28
@ edthethird: หากต้องการรับ PKCS8 ให้เพิ่มแฟล็ก -nodes
Christopher K.

7
-passout pass:เพื่อการส่งออกได้โดยไม่ต้องใช้รหัสผ่านเพิ่ม โดยคาดว่าพารามิเตอร์จะอยู่ในรูปแบบการส่งผ่าน: mypassword stackoverflow.com/a/27497899/206277
2559

2
@ChristopherK ขอบคุณ! นั่นคือสิ่งที่ดีสำหรับฉัน การเพิ่มการ-nodesส่งออกคีย์อย่างถูกต้อง
TecHunter

85

สิ่งนี้เป็นไปได้ด้วยการแปลงรูปแบบเล็กน้อย

เพื่อแยกคีย์ส่วนตัวในรูปแบบ openssh สามารถใช้:

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

วิธีแปลงคีย์ส่วนตัวเป็นกุญแจสาธารณะ:

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

เพื่อแยกคีย์สาธารณะในรูปแบบ openssh สามารถใช้:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

2
ขอบคุณ! บรรทัดแรกคือสิ่งที่ฉันต้องการ เพียงคีย์ไม่ได้เข้ารหัสดังนั้นจึงสามารถติดตั้งผ่านระบบอัตโนมัติ CDNs ส่วนใหญ่
BTC

1
@PhilipRego ฉันคิดว่าคุณมีกุญแจสาธารณะและกุญแจส่วนตัวสับสน คีย์สาธารณะ RSA คือสองค่าคือ 'e' exponent สาธารณะและ 'n' โมดูลัส - ซึ่งทั้งสองจะถูกเก็บไว้ด้านข้างส่วนส่วนตัวของคีย์
ryanc

17

OpenSSH ไม่สามารถใช้ไฟล์ PKCS # 12 ได้ ตามที่คนอื่นแนะนำคุณต้องแยกคีย์ส่วนตัวในรูปแบบ PEM ซึ่งทำให้คุณได้รับจากดินแดนของ OpenSSL ไปยัง OpenSSH โซลูชันอื่น ๆ ที่กล่าวถึงในที่นี้ไม่ได้ผลสำหรับฉัน ฉันใช้ OS X 10.9 Mavericks (10.9.3 ในขณะนี้) ด้วยยูทิลิตี้“ prepackaged” (OpenSSL 0.9.8y, OpenSSH 6.2p2)

ขั้นแรกให้แยกคีย์ส่วนตัวในรูปแบบ PEM ซึ่งจะใช้โดยตรงโดย OpenSSH:

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

ฉันขอแนะนำให้เข้ารหัสคีย์ส่วนตัวด้วยรหัสผ่าน:

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

เห็นได้ชัดว่าการเขียนรหัสผ่านข้อความธรรมดาบนบรรทัดคำสั่งไม่ปลอดภัยเช่นกันดังนั้นคุณควรลบคำสั่งสุดท้ายออกจากประวัติหรือเพียงตรวจสอบให้แน่ใจว่ามันไม่ได้ไปที่นั่น กระสุนที่แตกต่างกันมีวิธีที่แตกต่างกัน คุณสามารถใส่คำสั่งล่วงหน้าด้วยช่องว่างเพื่อป้องกันไม่ให้คำสั่งบันทึกลงในประวัติใน Bash และเชลล์อื่น ๆ นี่คือวิธีการลบคำสั่งจากประวัติใน Bash:

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

หรือคุณสามารถใช้วิธีอื่นในการส่งรหัสผ่านไพรเวตคีย์ไปยัง OpenSSL - ศึกษาเอกสารประกอบ OpenSSL เพื่อหาข้อโต้แย้งวลีวลีรหัสผ่านสำหรับอาร์กิวเมนต์วลีรหัสผ่าน

จากนั้นสร้างคีย์สาธารณะ OpenSSH ซึ่งสามารถเพิ่มลงในไฟล์ authorized_keys:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

มีไว้| openssl rsaเพื่ออะไร?
Snekse

1
@Snekse ทำให้แน่ใจว่ามีคีย์ส่วนตัวเท่านั้นในผลลัพธ์ ในกรณีของฉันมันจะสร้างไฟล์ข้อมูลประจำตัว ( ~/.ssh/id_rsa) ด้วย“ cruft” บางอย่างเช่น Bag Attributes โดยไม่มี `| openssl rsa` ฉันเดาว่า OpenSSH และยูทิลิตี้อื่น ๆ ที่ใช้ไฟล์ข้อมูลประจำตัวสามารถจัดการ cruft นั้นได้ (ฉันไม่ได้ลอง) แต่ฉันก็แค่ใช้เพื่อให้ข้อมูลที่จำเป็นเท่านั้นและไม่มีอะไรเพิ่มเติม
frzng

1
คำตอบนี้ใช้ได้สำหรับฉันในการเข้าถึงคีย์ส่วนตัวในรูปแบบ PEM ในเทอร์มินัลซึ่งฉันสามารถคัดลอก / วาง: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus

7

โซลูชันที่ 1:

แยก P12 จาก jks

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

แยก PEM จาก P12 และแก้ไขไฟล์และ pem จากไฟล์ crt

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

แยกคีย์ออกจาก jks

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

โซลูชันที่ 2:

แยก PEM และเข้ารหัสส่วนบุคคลคีย์ไปที่ txt file```

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

ถอดรหัส privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1
เมื่อตอบคำถามจะช่วยเน้นว่าคำสั่งนั้นคืออะไร คุณสามารถทำได้โดยการเพิ่มสาม backquotes ก่อนและหลังคำสั่งเพื่อ `` `ก้อง hello``` echo helloกลายเป็น
PatS

2

อัปเดต:ฉันสังเกตเห็นว่าคำตอบของฉันเป็นเพียงคำถามซ้ำ ๆ ที่อธิบายได้ดีในhttps: //unix.stackexchange.com / ...โดยBryKKan

นี่คือสารสกัดจากมัน:

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>

3
การเพิ่มคำอธิบายบางอย่างจะทำให้คำตอบนี้มีประโยชน์มากขึ้น
mx0

0

เท่าที่ฉันรู้ PKCS # 12 เป็นเพียงที่เก็บคีย์ใบรับรอง / สาธารณะ / ส่วนตัว หากคุณแยกพับลิกคีย์จากไฟล์ PKCS # 12 OpenSSH ควรจะสามารถใช้งานได้ตราบใดที่มันถูกแยกในรูปแบบPEM คุณอาจรู้อยู่แล้วว่าคุณจำเป็นต้องมีคีย์ส่วนตัวที่สอดคล้องกัน (เช่นเดียวกับในPEM ) เพื่อที่จะใช้มันสำหรับการตรวจสอบสิทธิ์ของคีย์สาธารณะ ssh


0

คำตอบที่ได้รับการยอมรับคือคำสั่งที่ถูกต้องฉันแค่ต้องการเพิ่มอีกหนึ่งอย่างเมื่อแยกคีย์ออกหากคุณปล่อยรหัสผ่าน PEM ( "Enter PEM pass phrase:") ว่างไว้คีย์ที่สมบูรณ์จะไม่ถูกแยกออกมา แต่localKeyIDจะแยกเท่านั้น ในการรับรหัสที่สมบูรณ์คุณต้องระบุรหัสผ่าน PEM ที่ใช้คำสั่งต่อไปนี้

โปรดทราบว่าเมื่อมันมาถึงนำเข้ารหัสผ่านคุณสามารถระบุรหัสผ่านที่แท้จริงสำหรับ"Enter Import Password:"หรือสามารถปล่อยให้รหัสผ่านนี้ว่างเปล่า:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem

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