Bu sorunu, varsayılan JVM güvenilen ana bilgisayarlarının bir parçası olmayan bir sertifika sağlayıcısına kovaladım JDK 8u74
. Sağlayıcı www.identrust.com , ancak bağlanmaya çalıştığım alan adı bu değildi. Bu alan adı sertifikasını bu sağlayıcıdan almıştı. Bkz . Çapraz kök kapak JDK / JRE'deki varsayılan listeye güvenecek mi? - birkaç girişi okuyun. Ayrıca bkz. Hangi tarayıcılar ve işletim sistemleri Let's Encrypt'i destekler .
Bu nedenle, ilgilendiğim alan adı ile bağlantı kurmak için identrust.com
aşağıdaki adımları izleyen bir sertifika aldım. Temel olarak, identrust.com (DST Root CA X3
JVM tarafından güvenilecek ) sertifikası . Bunu Apache HttpComponents 4.5 kullanarak böyle yapabildim:
1: Sertifika , Sertifika Zinciri İndirme Talimatlarındaki güvencesinden alın . Tıklayın DST Kök CA X3 bağlantısını.
2: Dizeyi "DST Root CA X3.pem" adlı bir dosyaya kaydedin. Dosyaya başında ve sonunda "----- BAŞLANGIÇ BELGESİ -----" ve "----- SON BELGESİ -----" satırlarını eklediğinizden emin olun.
3: Aşağıdaki komutla bir java keystore dosyası, cacerts.jks oluşturun:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Ortaya çıkan cacerts.jks anahtar deposunu java / (maven) uygulamanızın kaynaklar dizinine kopyalayın.
5: Bu dosyayı yüklemek ve Apache 4.5 HttpClient'e eklemek için aşağıdaki kodu kullanın. Bu, indetrust.com
util oracle tarafından verilen sertifikalara sahip olan tüm etki alanı için sorunu JRE varsayılan anahtar deposuna ekler.
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();
Proje oluşturulduğunda, cacerts.jks sınıf yoluna kopyalanacak ve oradan yüklenecektir. Bu noktada, diğer ssl sitelerine karşı test etmedim, ancak yukarıdaki kod bu sertifikada "zincirler" ise o zaman onlar da çalışacak, ama yine bilmiyorum.
Başvuru: Özel SSL içeriği ve Java HttpsURLConnection ile kendinden imzalı bir sertifikayı nasıl kabul edebilirim?