Ich habe dieses Problem an einen Zertifikatanbieter weitergeleitet, der ab sofort nicht mehr zu den standardmäßigen vertrauenswürdigen JVM-Hosts gehört JDK 8u74
. Der Anbieter ist www.identrust.com , aber das war nicht die Domain, zu der ich eine Verbindung herstellen wollte. Diese Domain hatte ihr Zertifikat von diesem Anbieter erhalten. Siehe Wird das Cross-Root-Cover der Standardliste im JDK / JRE vertrauen? - Lesen Sie ein paar Einträge. Siehe auch Welche Browser und Betriebssysteme unterstützen Let's Encrypt .
Um eine Verbindung zu der Domain herzustellen, an der ich interessiert war und von der ein Zertifikat ausgestellt wurde, habe identrust.com
ich die folgenden Schritte ausgeführt. Grundsätzlich musste ich das identrust.com ( DST Root CA X3
) -Zertifikat erhalten, um von der JVM als vertrauenswürdig eingestuft zu werden. Ich konnte das mit Apache HttpComponents 4.5 wie folgt machen:
1: Beziehen Sie das Zertifikat von indettrust in den Anweisungen zum Herunterladen der Zertifikatskette . Klicken Sie auf den Link DST Root CA X3 .
2: Speichern Sie die Zeichenfolge in einer Datei mit dem Namen "DST Root CA X3.pem". Stellen Sie sicher, dass Sie die Zeilen "----- BEGIN CERTIFICATE -----" und "----- END CERTIFICATE -----" in die Datei am Anfang und am Ende einfügen.
3: Erstellen Sie eine Java-Keystore-Datei, cacerts.jks, mit dem folgenden Befehl:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4: Kopieren Sie den resultierenden Keystore cacerts.jks in das Ressourcenverzeichnis Ihrer Java / (Maven) -Anwendung.
5: Verwenden Sie den folgenden Code, um diese Datei zu laden und an den Apache 4.5 HttpClient anzuhängen. Dadurch wird das Problem für alle Domänen gelöst, für die Zertifikate von indetrust.com
util oracle ausgestellt wurden, die das Zertifikat in den JRE-Standardschlüsselspeicher aufnehmen.
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();
Wenn das Projekt erstellt wird, werden die cacerts.jks in den Klassenpfad kopiert und von dort geladen. Ich habe zu diesem Zeitpunkt noch keine Tests mit anderen SSL-Sites durchgeführt, aber wenn der obige Code "Ketten" in diesem Zertifikat enthält, funktionieren sie auch, aber ich weiß es auch nicht.
Referenz: Benutzerdefinierter SSL-Kontext und Wie akzeptiere ich ein selbstsigniertes Zertifikat mit einer Java HttpsURLConnection?