วิธีอิมพอร์ตใบรับรอง. cer ไปยังที่เก็บคีย์ java


226

ในระหว่างการพัฒนาไคลเอนต์ Java เว็บเซอร์ฉันพบปัญหา การรับรองความถูกต้องสำหรับเว็บเซอร์กำลังใช้ใบรับรองไคลเอ็นต์ชื่อผู้ใช้และรหัสผ่าน ใบรับรองไคลเอนต์ที่ฉันได้รับจาก บริษัท ที่อยู่เบื้องหลังเว็บเซอร์เวอร์อยู่ใน.cerรูปแบบ เมื่อฉันตรวจสอบไฟล์โดยใช้โปรแกรมแก้ไขข้อความมันมีเนื้อหาดังต่อไปนี้:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

ฉันสามารถนำเข้าไฟล์นี้เป็นใบรับรองใน Internet Explorer (โดยไม่ต้องป้อนรหัสผ่าน!) และใช้มันเพื่อตรวจสอบสิทธิ์กับ webservice

ฉันสามารถนำเข้าใบรับรองนี้ไปยังที่เก็บคีย์ได้โดยการเปิดบรรทัดแรกและบรรทัดสุดท้ายโดยแปลงเป็นยูนิกซ์ขึ้นบรรทัดใหม่และรัน base64-decode ไฟล์ผลลัพธ์สามารถอิมพอร์ตไปยังที่เก็บคีย์ (โดยใช้keytoolคำสั่ง) เมื่อฉันแสดงรายการใน keystore รายการนี้เป็นชนิดtrustedCertEntryที่รายการนี้เป็นชนิดที่ เนื่องจากประเภทรายการนี้ (?) ฉันไม่สามารถใช้ใบรับรองนี้เพื่อตรวจสอบสิทธิ์กับเว็บเซอร์ ฉันเริ่มคิดว่าใบรับรองที่ให้ไว้เป็นใบรับรองสาธารณะที่ใช้สำหรับการตรวจสอบสิทธิ์ ...

วิธีแก้ปัญหาที่ฉันพบคือการนำเข้าใบรับรองใน IE และส่งออกเป็น.pfxไฟล์ ไฟล์นี้สามารถโหลดเป็นที่เก็บคีย์และสามารถใช้เพื่อพิสูจน์ตัวตนกับเว็บเซอร์ อย่างไรก็ตามฉันไม่สามารถคาดหวังให้ลูกค้าทำตามขั้นตอนเหล่านี้ทุกครั้งที่ได้รับใบรับรองใหม่ ดังนั้นฉันต้องการโหลด.cerไฟล์ลงใน Java โดยตรง ความคิดใด ๆ

ข้อมูลเพิ่มเติม: บริษัท ที่อยู่เบื้องหลังเว็บเซอร์บอกฉันว่าควรมีการร้องขอใบรับรอง (โดยใช้ IE & เว็บไซต์) จากพีซีและผู้ใช้ที่จะนำเข้าใบรับรองในภายหลัง

คำตอบ:


317
  • หากคุณต้องการตรวจสอบสิทธิ์คุณจำเป็นต้องมีคีย์ส่วนตัว - ไม่มีตัวเลือกอื่น
  • ใบรับรองเป็นกุญแจสาธารณะที่มีคุณสมบัติพิเศษ (เช่นชื่อ บริษัท ประเทศ ... ) ที่ลงนามโดยหน่วยงานออกใบรับรองบางรายที่รับรองว่าคุณสมบัติที่แนบมานั้นเป็นจริง
  • .CERไฟล์คือใบรับรองและไม่มีคีย์ส่วนตัว ไพรเวตคีย์ให้มาพร้อมกับ.PFX keystoreไฟล์ตามปกติ หากคุณรับรองความถูกต้องจริง ๆ เพราะคุณได้นำเข้ากุญแจส่วนตัวแล้ว
  • โดยปกติคุณสามารถนำเข้า.CERใบรับรองได้โดยไม่มีปัญหาใด ๆ

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
ปรากฎว่ามีการสร้างคีย์ส่วนตัวโดยปลั๊กอินสำหรับ IE วิธีแก้ปัญหาเฉพาะสำหรับตอนนี้คือการนำเข้าใบรับรองใน IE และส่งออกไฟล์. pfx
Jan-Pieter

5
ไฟล์. CER มีคีย์สาธารณะ พวกเขาไม่มีรหัสส่วนตัว แนะนำการแก้ไข ..
KyleM

6
-alias ทำอะไรที่นี่?
กระโดด

5
:( -> ข้อผิดพลาด keytool: java.lang.Exception: ป้อนไม่ใช่ใบรับรอง X.509
หมอผี

1
@hop ที่เก็บคีย์ java สามารถมีใบรับรองจำนวนมากแต่ละใบรับรองที่มีชื่อแทนอื่นเพื่อระบุ คุณสามารถใช้มันเป็นข้อมูลอ้างอิงเพื่อระบุและ / หรือเพื่อเรียกคืนแบบเป็นโปรแกรมโดยใช้ชื่อนามแฝง
lujop

85

การนำเข้า.cerแฟ้มใบรับรองดาวน์โหลดได้จากเบราว์เซอร์ (เปิด url และขุดสำหรับรายละเอียด) เข้าcacerts keystore ในjava_home\jre\lib\securityทำงานให้ฉันเมื่อเทียบกับ attemps ในการสร้างและใช้คีย์สโตร์ของตัวเอง

  1. ไปที่ของคุณ java_home\jre\lib\security
  2. ( Windows ) เปิดบรรทัดคำสั่งของผู้ดูแลระบบโดยใช้cmdและCTRL+ SHIFT+ENTER
  3. รัน keytool เพื่ออิมพอร์ตใบรับรอง:
    • (แทนที่yourAliasNameและpath\to\certificate.cerตามลำดับ)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

วิธีนี้คุณไม่ต้องระบุตัวเลือก JVM เพิ่มเติมใด ๆ และควรรับรองโดย JRE


เส้นทาง \ to \ ใบรับรอง หากไฟล์ของฉันอยู่บนเดสก์ท็อปฉันจะกำหนดเส้นทางอย่างไร C: / ผู้ใช้ / เดสก์ท็อป / หรือ ../../../../desktop/filename
Jesse

บน MacOS / Linux คำสั่งนี้ใช้งานได้กับ sudo ขอบคุณ แต่ param noprompt คืออะไร? ฉันไม่ได้ใช้และยังคงประสบความสำเร็จ
Evgeniy Mishustin

โปรดทราบว่าเมื่อใช้ JDK สำหรับการพัฒนาเส้นทางที่ถูกต้องคือjava_home\jdk_x.xx\jre\lib\security สำหรับเส้นทางที่แน่นอนใช้เครื่องหมายแบ็กสแลชเช่น"C:\myCert.crt"เครื่องหมายอัญประกาศเป็นตัวเลือกหากเส้นทางไม่มีช่องว่าง
jp-jee

ขอบคุณล้านครั้ง
vikingsteve

คำถาม: แล้วคีย์ส่วนตัวล่ะ? การสนทนาเป็นเรื่องเกี่ยวกับใบรับรองลูกค้า ความเข้าใจของฉันคือต้องมีการสร้าง CSR ด้วยรหัสส่วนตัวจากนั้นรับใบรับรองลูกค้าจาก บริษัท เว็บไซต์ระยะไกลแล้วจับคู่ใบรับรองลูกค้ากับรหัสส่วนตัว คำตอบของคุณดูเหมือนจะไม่พูดถึงอะไรเกี่ยวกับคีย์ส่วนตัว แค่ถาม.
user2367418

51

นี่คือรหัสที่ฉันใช้สำหรับการนำเข้าไฟล์. cer โดยทางโปรแกรมลงใน KeyStore ใหม่

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

คุณไม่ควรทำการเปลี่ยนแปลงใด ๆ กับใบรับรอง คุณแน่ใจหรือว่าคุณกำลังใช้คำสั่งการนำเข้าที่ถูกต้อง?

งานต่อไปนี้สำหรับฉัน:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

โดยที่ mycert.cer ประกอบด้วย:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
เมื่อฉันพยายามนำเข้าใบรับรองที่ไม่ได้แก้ไขใน keystore ฉันได้รับข้อผิดพลาด "ข้อผิดพลาด keytool: java.lang.Exception: ป้อนไม่ใช่ใบรับรอง X.509" หลังจากแก้ไขใบรับรองในแบบที่ฉันอธิบายในโพสต์ของฉันฉันสามารถนำเข้าใบรับรองโดยไม่มีข้อผิดพลาดด้วยคำสั่งที่คล้ายกับของคุณ อย่างไรก็ตามจะถูกนำเข้าเป็น TrustedCertEntry และไม่ได้ใช้เมื่อเข้าถึงเว็บเซอร์
Jan-Pieter

คุณสามารถเพิ่มคำสั่งยกเว้นในคำถามได้ไหม? คุณแน่ใจหรือไม่ว่าคุณกำลังระบุนามแฝงในคำสั่งการนำเข้าของคุณ?
dogbane

อย่าลืมเรียกใช้ cmd ในฐานะผู้ดูแลระบบหากคุณใช้ Windows
SilentBob470

9

เครื่องมือ GUI โอเพนซอร์สมีอยู่ที่keystore-explorer.org

KeyStore Explorer

KeyStore Explorer เป็นการทดแทน GUI โอเพนซอร์สสำหรับ keytool อรรถประโยชน์บรรทัดคำสั่ง Java และ jarsigner KeyStore Explorer นำเสนอฟังก์ชั่นการใช้งานและอื่น ๆ ผ่านส่วนต่อประสานกราฟิกกับผู้ใช้ที่เข้าใจง่าย

หน้าจอต่อไปนี้จะช่วยได้ (มาจากเว็บไซต์อย่างเป็นทางการ)

หน้าจอเริ่มต้นที่คุณได้รับจากการรันคำสั่ง:

shantha@shantha:~$./Downloads/kse-521/kse.sh

ป้อนคำอธิบายรูปภาพที่นี่

และไปExamineและExamine a URLตัวเลือกและจากนั้นให้ URL เว็บที่คุณต้องการที่จะนำเข้า

หน้าต่างผลลัพธ์จะเหมือนด้านล่างหากคุณให้ลิงก์ของไซต์ Google ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นหนึ่งในกรณีการใช้งานและส่วนที่เหลือขึ้นอยู่กับผู้ใช้ (เครดิตทั้งหมดไปที่keystore-explorer.org )


7

ใบรับรองที่คุณมีอยู่อาจเป็นใบรับรองของเซิร์ฟเวอร์หรือใบรับรองที่ใช้ในการเซ็นรับรองใบรับรองของเซิร์ฟเวอร์ คุณจะต้องใช้มันเพื่อให้เว็บเซอร์วิสไคลเอ็นต์ของคุณสามารถพิสูจน์ตัวตนเซิร์ฟเวอร์

แต่หากคุณต้องทำการพิสูจน์ตัวตนลูกค้าด้วย SSL คุณต้องได้รับใบรับรองของคุณเองเพื่อรับรองความถูกต้องของเว็บเซอร์วิสของคุณ สำหรับสิ่งนี้คุณต้องสร้างคำขอใบรับรอง; กระบวนการเกี่ยวข้องกับการสร้างรหัสส่วนตัวของคุณเองและรหัสสาธารณะที่เกี่ยวข้องและการติดตั้งรหัสสาธารณะนั้นพร้อมกับข้อมูลบางส่วนของคุณ (อีเมลชื่อชื่อโดเมน ฯลฯ ) ไปยังไฟล์ที่เรียกว่าการร้องขอใบรับรอง จากนั้นคุณส่งการร้องขอใบรับรองนั้นไปยัง บริษัท ที่ขอให้คุณแล้วและพวกเขาจะสร้างใบรับรองของคุณโดยการเซ็นกุญแจสาธารณะของคุณด้วยรหัสส่วนตัวของพวกเขาและพวกเขาจะส่งคุณกลับไฟล์ X509 ด้วยใบรับรองของคุณซึ่งคุณสามารถ ตอนนี้เพิ่มที่เก็บคีย์ของคุณและคุณพร้อมที่จะเชื่อมต่อกับบริการเว็บโดยใช้ SSL ที่ต้องใช้การตรวจสอบสิทธิ์ไคลเอ็นต์

หากต้องการสร้างคำขอใบรับรองของคุณให้ใช้ "keytool -certreq -alias -file -keypass -keystore" ส่งไฟล์ผลลัพธ์ไปยัง บริษัท ที่จะลงนาม

เมื่อคุณได้รับใบรับรองกลับมาให้เรียกใช้ "keytool -importcert -alias -keypass -keystore"

คุณอาจต้องใช้ - storepass ในทั้งสองกรณีหากที่เก็บคีย์ได้รับการป้องกัน (ซึ่งเป็นความคิดที่ดี)


5

นี่คือสคริปต์ที่ฉันใช้ในการแบตช์ไฟล์ crt จำนวนมากในไดเรกทอรีปัจจุบันไปยังที่เก็บคีย์ java เพียงบันทึกสิ่งนี้ลงในโฟลเดอร์เดียวกับใบรับรองของคุณแล้วเรียกใช้อย่างเช่น:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

นี่คือวิธีการทำงานสำหรับฉัน:

  1. บันทึกเป็น. txt ข้อมูลใบรับรองในรูปแบบต่อไปนี้ในโปรแกรมแก้ไขข้อความ

    ----- เริ่มต้นใบรับรอง ----- [ข้อมูลต่อเนื่องโดย microsoft] ----- สิ้นสุดใบรับรอง -----

  2. เปิดเบราว์เซอร์ chrome (ขั้นตอนนี้อาจทำงานกับเบราว์เซอร์อื่นด้วย) การตั้งค่า> แสดงการตั้งค่าขั้นสูง> HTTPS / SSL> จัดการใบรับรองนำเข้า. txt ในขั้นตอนที่ 1
  3. เลือกและส่งออกใบรับรองนั้นในรูปแบบที่เข้ารหัส Base-64 บันทึกเป็น. cer
  4. ตอนนี้คุณสามารถใช้ keytool หรือ Portecle เพื่ออิมพอร์ตไปยังที่เก็บคีย์ java ของคุณ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.