Tôi đã giải quyết vấn đề này cho một nhà cung cấp chứng chỉ không phải là một phần của các máy chủ tin cậy JVM mặc định kể từ đó JDK 8u74
. Nhà cung cấp là www.identrust.com , nhưng đó không phải là tên miền tôi đang cố gắng kết nối. Tên miền đó đã nhận được chứng chỉ từ nhà cung cấp này. Xem phần tin cậy gốc chéo có được liệt kê theo danh sách mặc định trong JDK / JRE không? - đọc một vài mục. Đồng thời xem những trình duyệt và hệ điều hành nào hỗ trợ Let Encrypt .
Vì vậy, để kết nối với tên miền mà tôi quan tâm, có chứng chỉ được cấp từ identrust.com
tôi đã thực hiện các bước sau. Về cơ bản, tôi đã phải lấy DST Root CA X3
chứng chỉ nhận dạng ( ) được JVM tin cậy. Tôi đã có thể làm điều đó bằng cách sử dụng Apache httpComponents 4.5 như vậy:
1: Nhận chứng chỉ từ sự không hài lòng tại Hướng dẫn tải xuống chuỗi chứng chỉ . Nhấp vào liên kết DST Root CA X3 .
2: Lưu chuỗi vào tệp có tên "DST Root CA X3.pem". Hãy chắc chắn để thêm các dòng "----- BEGIN CHỨNG NHẬN -----" và "----- CHỨNG NHẬN KẾT THÚC -----" trong tệp ở đầu và cuối.
3: Tạo tệp java keystore, cacerts.jks bằng lệnh sau:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Sao chép kho khóa cacerts.jks kết quả vào thư mục tài nguyên của ứng dụng java / (maven) của bạn.
5: Sử dụng đoạn mã sau để tải tệp này và đính kèm nó vào Apache 4.5 HttpClient. Điều này sẽ giải quyết vấn đề cho tất cả các miền có chứng chỉ được cấp từ indetrust.com
orory bao gồm chứng chỉ vào kho khóa mặc định của 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();
Khi dự án xây dựng thì cacerts.jks sẽ được sao chép vào đường dẫn lớp và được tải từ đó. Tại thời điểm này, tôi đã không thử nghiệm các trang web ssl khác, nhưng nếu đoạn mã trên "chuỗi" trong chứng chỉ này thì chúng cũng sẽ hoạt động, nhưng một lần nữa, tôi không biết.
Tham khảo: Ngữ cảnh SSL tùy chỉnh và Làm cách nào để tôi chấp nhận chứng chỉ tự ký với HttpsURLCconnectection của Java?