วิธีการแปลงไฟล์. pfx เป็นที่เก็บคีย์ด้วยคีย์ส่วนตัว


107

ฉันต้องการลงนามแอปพลิเคชัน Android ( .apk)
ฉันมี.pfxไฟล์ ฉันแปลงเป็น.cerไฟล์ผ่าน Internet Explorer จากนั้นแปลง.cerเป็น.keystoreโดยใช้ keytool จากนั้นฉันได้พยายามลงชื่อ.apkกับ jarsigner แต่มันบอกว่า. keystore ไม่เนื้อหาคีย์ส่วนตัว

ฉันทำอะไรผิด?


สิ่งนี้มีประโยชน์: ฉันจะค้นหาและเรียกใช้ keytool สำหรับ Windows ได้อย่างไรstackoverflow.com/questions/5488339/…
Peter Barbanyaga

คำตอบ:


259

ใช้ JDK 1.6 หรือใหม่กว่า

จัสตินชี้ให้เห็นในความคิดเห็นด้านล่างนี้ว่า keytool เพียงอย่างเดียวสามารถทำได้โดยใช้คำสั่งต่อไปนี้ (แม้ว่าจะมีเฉพาะใน JDK 1.6 และใหม่กว่า):

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS

ใช้ JDK 1.5 หรือต่ำกว่า

OpenSSL สามารถทำได้ทั้งหมด คำตอบของ JGuruนี้เป็นวิธีที่ดีที่สุดที่ฉันเคยพบมา

อันดับแรกตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งOpenSSLแล้ว ระบบปฏิบัติการหลายระบบได้ติดตั้งไว้แล้วตามที่พบใน Mac OS X

คำสั่งสองคำสั่งต่อไปนี้แปลงไฟล์ pfx เป็นรูปแบบที่สามารถเปิดเป็นที่เก็บคีย์ Java PKCS12:

openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem
openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert"

โปรดทราบว่าชื่อที่ระบุในคำสั่งที่สองเป็นนามแฝงของคีย์ของคุณในที่เก็บคีย์ใหม่

คุณสามารถตรวจสอบเนื้อหาของที่เก็บคีย์โดยใช้ยูทิลิตี้ Java keytool ด้วยคำสั่งต่อไปนี้:

keytool -v -list -keystore mykeystore.p12 -storetype pkcs12

สุดท้ายหากคุณต้องการคุณสามารถแปลงสิ่งนี้เป็นที่เก็บคีย์ของ JKS ได้โดยการนำเข้าที่เก็บคีย์ที่สร้างไว้ด้านบนไปยังที่เก็บคีย์ใหม่:

keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS

28
ไม่จำเป็นต้องใช้ทั้งสามขั้นตอนเพียงเรียกใช้: keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
JustinMorris

ฉันคิดว่า Keytool เวอร์ชันเก่าจะไม่ยอมให้คุณทำ ฉันจำได้ว่าเมื่อ 8 ปีก่อนฉันต้องเรียกใช้ openssl แต่ตอนนี้ด้วย keytool ใน Oracle JDK 6 และ 7 มันใช้งานได้อย่างมีเสน่ห์เหมือนที่ Justin พูด
David Brossard

2
โปรดทราบว่าฉันให้คำตอบนั้นในรูปแบบที่ง่ายกว่าพร้อมรายละเอียดเพิ่มเติมหนึ่งปีก่อนจัสติน
gjpc

@gjpc สังเกต. คำตอบของคุณสมบูรณ์มากและควรค่าแก่การโหวตมาก ๆ :)
MikeD

นี่เป็นคำตอบที่ยอดเยี่ยมจริงๆและช่วยฉันได้หลังจากค้นคว้ามาหลายวัน คำตอบนี้สมควรได้รับการโหวตเพิ่มขึ้นมากมาย ขอบคุณครับ.
ตำนาน

22

jarsigner สามารถใช้ไฟล์ pfx ของคุณเป็นที่เก็บคีย์สำหรับการลงนาม jar ของคุณ ตรวจสอบให้แน่ใจว่าไฟล์ pfx ของคุณมีคีย์ส่วนตัวและโซ่ใบรับรองเมื่อคุณส่งออก ไม่จำเป็นต้องแปลงเป็นรูปแบบอื่น เคล็ดลับคือการได้รับนามแฝงของไฟล์ pfx ของคุณ:

 keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias

เมื่อคุณมีนามแฝงแล้วการเซ็นชื่อก็ทำได้ง่าย

jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias"

คำสั่งสองคำสั่งข้างต้นจะแจ้งให้คุณป้อนรหัสผ่านที่คุณระบุในการส่งออก pfx หากคุณต้องการให้รหัสผ่านแฮงเอาท์เป็นข้อความที่ชัดเจนให้ใช้สวิตช์-storepassก่อนสวิตช์-keystore

เมื่อลงชื่อแล้วชื่นชมผลงานของคุณ:

jarsigner.exe -verify -verbose -certs  yourjarfile

1
+1 เพื่อไม่ต้องแปลงไฟล์ที่เก็บคีย์ (ฉันมีในรูปแบบที่เพียงพอแล้ว!)
Trejkaz

22

ฉันพบหน้านี้ซึ่งจะบอกวิธีนำเข้า PFX ไปยัง JKS (Java Key Store):

keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME

3
นี่น่าจะเป็นคำตอบที่สมบูรณ์!
JustAGuy

ฉันกำลังมองหาคำตอบเช่นนี้ - ด้วยนามแฝง
user3437460

ฉันมีปัญหาหนึ่ง pfx ไม่มีรหัสผ่าน-srcstorepassปัญหาของฉันก็เช่นกัน PFX นี้สร้างโดยไคลเอนต์ LetsEncrypt สำหรับ Windows
FiruzzZ

2

ไฟล์ PFX ของคุณควรมีคีย์ส่วนตัวอยู่ภายใน ส่งออกคีย์ส่วนตัวและใบรับรองโดยตรงจากไฟล์ PFX ของคุณ (เช่นใช้ OpenSSL) และนำเข้าในที่เก็บคีย์ Java ของคุณ

แก้ไข

ข้อมูลเพิ่มเติม:

  • ดาวน์โหลด OpenSSL สำหรับ Windows ที่นี่
  • ส่งออกคีย์ส่วนตัว: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • ใบรับรองการส่งออก: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • นำเข้าคีย์ส่วนตัวและใบรับรองไปยังที่เก็บคีย์ Java โดยใช้keytool.

คุณช่วยบอกฉันหน่อยได้ไหมว่าฉันจะนำเข้า key.pem และ cert.pem โดยใช้ keytool ได้อย่างไร
Sad Al Abdullah

1
การเพิ่มขนาดเล็ก: คุณต้องเพิ่ม -nodes ในตอนท้ายเมื่อส่งออก ky ส่วนตัว
morgan_il

2

จัสติน (ด้านบน) แม่น อย่างไรก็ตามโปรดทราบว่าขึ้นอยู่กับว่าคุณได้รับใบรับรองจากใคร (CA ระดับกลาง, CA หลักที่เกี่ยวข้องหรือไม่) หรือวิธีการสร้าง / ส่งออก pfx บางครั้งอาจไม่มีห่วงโซ่ใบรับรอง หลังจากนำเข้าคุณจะมีใบรับรองประเภท PrivateKeyEntry แต่มีความยาว 1 เส้น

ในการแก้ไขปัญหานี้มีหลายตัวเลือก ตัวเลือกที่ง่ายกว่าในใจของฉันคือการนำเข้าและส่งออกไฟล์ pfx ใน IE (การเลือกตัวเลือกรวมใบรับรองทั้งหมดในเครือ) ขั้นตอนการนำเข้าและส่งออกใบรับรองใน IE ควรทำได้ง่ายมากและได้รับการบันทึกไว้อย่างดีจากที่อื่น

เมื่อส่งออกแล้วให้นำเข้าที่เก็บคีย์ตามที่ Justin ชี้ไว้ด้านบน ตอนนี้คุณจะมีที่เก็บคีย์ที่มีใบรับรองประเภท PrivateKeyEntry และมีความยาวโซ่ใบรับรองมากกว่า 1

ไคลเอนต์บริการเว็บที่ใช้. Net บางตัวเกิดข้อผิดพลาด (ไม่สามารถสร้างความสัมพันธ์ที่เชื่อถือได้) หากคุณไม่ทำตามข้างต้น


ดูเหมือนจะใช้ไม่ได้กับ IE11 ไม่สามารถรวมห่วงโซ่ใบรับรองได้แม้ว่าฉันจะบอกให้ก็ตาม ฉันรู้ว่าสิ่งนี้ได้ผลในอดีตแม้ว่า
Brian Knoblauch

0

หากคุณทำงานกับ JDK 1.5 หรือต่ำกว่ายูทิลิตี้ keytool จะไม่มี-importkeystoreตัวเลือก (ดูเอกสารคู่มือเครื่องมือปุ่มJDK 1.5 ) และวิธีแก้ปัญหาโดย MikeD จะพร้อมใช้งานโดยการถ่ายโอน.pfxบนเครื่องด้วย JDK ที่ใหม่กว่า (1.6 ขึ้นไป) เท่านั้น

ตัวเลือกใน JDK 1.5 หรือต่ำกว่าอีก (ถ้าคุณมีของ Oracle WebLogic สินค้า) คือการปฏิบัติตามคำแนะนำจากเอกสารของ Oracle นี้: การใช้ PFX และ PEM รับรองรูปแบบกับ keystores อธิบายถึงการแปลงเป็น.pemรูปแบบวิธีดึงข้อมูลใบรับรองจากรูปแบบข้อความนี้และนำเข้าใน.jksรูปแบบด้วยjava utils.ImportPrivateKeyยูทิลิตี้ (เป็นยูทิลิตี้ที่มาพร้อมกับผลิตภัณฑ์ WebLogic)

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