อิมพอร์ตห่วงโซ่ใบรับรอง PEM และคีย์ไปยัง Java Keystore


29

มีแหล่งข้อมูลมากมายเกี่ยวกับหัวข้อนี้ แต่ไม่มีฉันพบซึ่งครอบคลุมกรณีพิเศษเล็กน้อยนี้

ฉันมี 4 ไฟล์;

  • privatekey.pem
  • certificate.pem
  • intermediate_rapidssl.pem
  • ca_geotrust_global.pem

และฉันต้องการที่จะนำเข้ามันเข้าไปในที่เก็บคีย์ใหม่

บางไซต์แนะนำให้ใช้รูปแบบ DER และนำเข้าทีละรูปแบบ แต่สิ่งนี้ล้มเหลวเนื่องจากไม่รู้จักรหัส

ไซต์อื่นแนะนำพิเศษ "ImportKey" -class เพื่อเรียกใช้การนำเข้าและสิ่งนี้ใช้ได้จนกว่าฉันจะเห็นว่าสายโซ่ขาด คือความยาวสายโซ่ของใบรับรองคือ 1 โดยไม่ต้องคำนึงถึงสื่อกลางและ ca

บางเว็บไซต์แนะนำ PKCS7 แต่ฉันไม่สามารถรับสายได้ อื่น ๆ แนะนำให้ใช้รูปแบบ PKCS12 แต่เท่าที่การทดสอบของฉันไปนั้นก็ล้มเหลวเช่นกันในการรับโซ่ทั้งหมด

คำแนะนำหรือคำแนะนำใด ๆ ยินดีต้อนรับมาก

คำตอบ:


26

สิ่งนี้อาจไม่สมบูรณ์แบบ แต่ฉันมีบันทึกย่อบางอย่างเกี่ยวกับการใช้งานkeytoolที่ฉันแก้ไขสำหรับสถานการณ์ของคุณ

  1. อิมพอร์ตใบรับรอง CA ระดับ root หรือระดับกลางไปยังที่เก็บคีย์ Java ที่มีอยู่:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. รวมใบรับรองและรหัสส่วนตัวลงในไฟล์เดียวก่อนนำเข้า

    cat certificate.pem privatekey.pem > combined.pem
    

    ซึ่งจะส่งผลให้ไฟล์คล้ายกับรูปแบบด้านล่าง

    BEGIN CERTIFICATE
    ...
    จบใบรับรอง
    BEGIN RSA PRIVATE KEY
    ...
    จบ RSA PRIVATE KEY

  3. อิมพอร์ตใบรับรอง & คีย์หลักที่ลงชื่อแล้วไปยังที่เก็บคีย์ Java ที่มีอยู่:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    

2
Keytool เวอร์ชันใดที่อนุญาตให้คุณเชื่อมโยงสิ่งนี้ ไวยากรณ์นี้ให้ "ข้อผิดพลาด keytool: java.lang.Exception: ใบรับรองไม่ได้ถูกนำเข้านามแฝง <root> มีอยู่แล้ว" กับทั้ง -import และ -importcert
ctpenrose

ยากที่จะพูดอย่างแน่นอน แต่เมื่อพิจารณาปี / เดือนมันน่าจะเป็น Java 6 หรือไม่? (ไม่ทราบว่าเป็นรุ่นย่อย) คุณใช้เวอร์ชันใดอยู่ ข้อผิดพลาดที่อ่านเช่นปัญหาอาจเกิดขึ้นกับที่เก็บคีย์เอง ( alias <root> already exists) คุณสามารถลองกับ keystore ใหม่ที่ว่างเปล่าได้หรือไม่?
Aaron Copley

1
Keytool จะไม่ให้ฉันนำเข้าใบรับรองโดยใช้นามแฝงที่มีอยู่แล้ว 'root' แต่ฉันคิดว่ามันเป็นตัวพิมพ์ผิด น่าสนใจที่จะทราบว่า keytool สร้างสายโซ่สำหรับใบรับรองของคุณเองเมื่อพบใบรับรองของผู้ลงนามในที่เก็บคีย์ (ภายใต้นามแฝงใด ๆ ) เครื่องมือ Java "Portecle"มีประโยชน์สำหรับการจัดการที่เก็บคีย์ java
Houtman

Keytool ไม่ทำงานเช่นนี้และไม่อนุญาตให้คุณนำเข้านามแฝงมากกว่าหนึ่งครั้งตามที่อธิบายไว้ (และใช่ฉันได้ลองแล้ว) ดูคำตอบของ senajqerib ด้านล่างสำหรับสิ่งที่ทำงานได้อย่างถูกต้อง
Steve Sether

1
มันเป็นคำตอบอายุสามขวบ เป็นไปได้อย่างสิ้นเชิงว่าสิ่งต่าง ๆ มีการเปลี่ยนแปลง แต่ฉันรับรองว่ามันใช้งานได้ (หรือใกล้เคียงกับการทำงานตามที่ฉันระบุว่าอาจไม่สมบูรณ์) ณ เดือนกุมภาพันธ์ 2013 โปรดส่งการแก้ไขหรือตั้งค่าสถานะเพื่อให้ผู้ดูแลสนใจ
Aaron Copley

42

เชื่อมต่อไฟล์ * .pem ทั้งหมดเป็นไฟล์ pem เดียวเช่น all.pem จากนั้นสร้างที่เก็บคีย์ในรูปแบบ p12 ด้วยคีย์ส่วนตัว + all.pem

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

จากนั้นส่งออก p12 ไปยัง jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks

ขอขอบคุณ. นี่เป็นเพียงคำตอบที่สมบูรณ์และถูกต้องเท่านั้น ตามที่คุณแนะนำไว้มันง่ายกว่าที่จะต่อข้อมูลเข้าด้วยกันเป็นไฟล์เดียว
Steve Sether

สิ่งนี้ได้ผลเหมือนกับการรักษาสำหรับฉัน !! ฉันใช้คำแนะนำเหล่านี้เพื่อแปลงเชนของคีย์ที่ใช้ในที่เก็บ nodejs-self-signed-certificate-certificate เพื่อพูดคุยกับเซิร์ฟเวอร์ TLS ที่ใช้ Java ขอบคุณหนึ่งล้าน!
Galder Zamarreño

นี่คือคำตอบที่ถูกต้อง
sfThomas

8

keytool ไม่มีวิธีในการนำเข้าใบรับรอง + รหัสส่วนตัวจากไฟล์เดียว (รวมกัน) ตามที่เสนอข้างต้น มันทำงานได้ดี แต่มีการนำเข้าใบรับรองเท่านั้นในขณะที่คีย์ส่วนตัวจะถูกละเว้น คุณสามารถตรวจสอบได้โดยkeytool -list -v -keystore yourkeystore.jks- ประเภทรายการโดเมนของคุณคือ TrustedCertEntry ไม่ใช่ PrivateKeyEntry

ดังนั้นเพื่อแก้ปัญหาที่เกิดขึ้นเริ่มต้นครั้งแรกควรสร้าง PKCS # 12 keystore ใช้ OpenSSL (หรือเครื่องมือที่คล้ายกัน) keytool -importkeystoreจากนั้นนำเข้าเก็บคีย์กับ

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