ผมไล่ลงปัญหานี้กับผู้ให้บริการใบรับรองที่ไม่เป็นส่วนหนึ่งของการเริ่มต้น JVM JDK 8u74
ที่เชื่อถือได้เป็นเจ้าภาพของ ผู้ให้บริการคือwww.identrust.comแต่นั่นไม่ใช่โดเมนที่ฉันพยายามเชื่อมต่อ โดเมนนั้นได้รับใบรับรองจากผู้ให้บริการนี้ ดูที่ความน่าเชื่อถือของใบปะหน้าข้ามรากโดยรายการเริ่มต้นใน JDK / JRE - อ่านรายการสองสามรายการ ยังเห็นเบราว์เซอร์ซึ่งระบบปฏิบัติการและสนับสนุน Let 's เข้ารหัส
ดังนั้นเพื่อเชื่อมต่อกับโดเมนที่ฉันสนใจซึ่งมีใบรับรองที่ออกให้จากidentrust.com
ฉันทำตามขั้นตอนต่อไปนี้ โดยพื้นฐานแล้วฉันต้องได้รับการDST Root CA X3
รับรองจากเชื่อถือได้โดย JVM ฉันสามารถทำได้โดยใช้ Apache HttpComponents 4.5 เช่นนั้น:
1: ขอรับใบรับรองจาก indettrust ที่รับรองโซ่ดาวน์โหลดคำแนะนำ คลิกที่ลิงก์DST Root CA X3
2: บันทึกสตริงลงในไฟล์ชื่อ "DST Root CA X3.pem" อย่าลืมเพิ่มบรรทัด "----- BEGIN CERTIFICATE -----" และ "----- END CERTIFICATE -----" ในไฟล์ที่จุดเริ่มต้นและจุดสิ้นสุด
3: สร้างไฟล์ที่เก็บคีย์ java, cacerts.jks ด้วยคำสั่งต่อไปนี้:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: คัดลอก cacerts.jks keystore ผลลัพธ์ลงในไดเร็กทอรี resources ของแอ็พพลิเคชัน java / (maven) ของคุณ
5: ใช้รหัสต่อไปนี้เพื่อโหลดไฟล์นี้และแนบกับ Apache 4.5 HttpClient สิ่งนี้จะแก้ปัญหาสำหรับโดเมนทั้งหมดที่มีใบรับรองที่ออกจากindetrust.com
util oracle รวมถึงใบรับรองในที่เก็บคีย์ดีฟอลต์ JRE
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
เมื่อโครงการสร้างแล้ว cacerts.jks จะถูกคัดลอกลงใน classpath และโหลดจากที่นั่น ในเวลานี้ฉันไม่ได้ทดสอบไซต์ ssl อื่น ๆ แต่ถ้ารหัส "โซ่" ข้างต้นในใบรับรองนี้พวกเขาจะใช้งานได้เช่นกัน แต่อีกครั้งฉันไม่รู้
การอ้างอิง: บริบท SSL ที่กำหนดเองและฉันจะยอมรับใบรับรองที่ลงนามเองด้วย Java HttpsURLConnection ได้อย่างไร