Saya mengejar masalah ini ke penyedia sertifikat yang bukan bagian dari host tepercaya JVM default JDK 8u74
. Penyedia adalah www.identrust.com , tetapi itu bukan domain yang saya coba sambungkan. Domain itu telah mendapatkan sertifikat dari penyedia ini. Lihat Akankah cross root percaya dengan daftar default di JDK / JRE? - Baca beberapa entri. Juga lihat Browser dan sistem operasi mana yang mendukung Let's Encrypt .
Jadi, untuk menghubungkan ke domain saya tertarik, yang memiliki sertifikat yang dikeluarkan dari identrust.com
saya lakukan langkah-langkah berikut. Pada dasarnya, saya harus mendapatkan identrust.com (DST Root CA X3
sertifikat ) agar dipercaya oleh JVM. Saya dapat melakukannya dengan menggunakan Apache HttpComponents 4.5 seperti:
1: Dapatkan sertifikat dari indettrust di Petunjuk Unduhan Rantai Sertifikat . Klik tautan DST Root CA X3 .
2: Simpan string ke file bernama "DST Root CA X3.pem". Pastikan untuk menambahkan baris "----- BEGIN CERTIFICATE -----" dan "----- END CERTIFICATE -----" dalam file di awal dan akhir.
3: Buat file java keystore, cacerts.jks dengan perintah berikut:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Salin keystore cacerts.jks yang dihasilkan ke direktori sumber daya aplikasi java / (maven) Anda.
5: Gunakan kode berikut untuk memuat file ini dan lampirkan ke Apache 4.5 HttpClient. Ini akan menyelesaikan masalah untuk semua domain yang memiliki sertifikat yang dikeluarkan dari indetrust.com
util oracle menyertakan sertifikat ke dalam keystore default 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();
Ketika proyek dibangun maka cacerts.jks akan disalin ke classpath dan diambil dari sana. Saya tidak, pada saat ini, menguji terhadap situs ssl lain, tetapi jika kode di atas "rantai" dalam sertifikat ini maka mereka akan bekerja juga, tapi sekali lagi, saya tidak tahu.
Referensi: Konteks SSL khusus dan Bagaimana cara saya menerima sertifikat yang ditandatangani sendiri dengan Java HttpsURLConnection?