Wie umgeht man die SSL-Zertifikatsprüfung in Java?
Veröffentlicht: 2023-02-08Secure Sockets Layer (SSL) und Transport Layer Security (TLS) sind Verschlüsselungsprotokolle, die häufig verwendet werden, um die Kommunikation über das Internet zu sichern. Wenn ein Client (z. B. ein Webbrowser) über SSL/TLS mit einem Server kommuniziert, präsentiert der Server ein Zertifikat, mit dem der Client die Identität des Servers überprüfen kann. Wenn das Zertifikat nicht gültig ist, zeigt der Client normalerweise eine Warnung an und verweigert die Kommunikation mit dem Server.
Es kann jedoch vorkommen, dass Sie diese Zertifikatsvalidierung umgehen müssen, z. B. während des Testens oder beim Herstellen einer Verbindung zu einem internen Server mit einem selbstsignierten Zertifikat. In diesem Beitrag zeigen wir Ihnen, wie Sie die SSL-Zertifikatsvalidierung in Java deaktivieren.
Warum das Umgehen der SSL-Zertifikatvalidierung nicht empfohlen wird
Das Umgehen der SSL-Zertifikatsvalidierung untergräbt die Sicherheit der SSL/TLS-Verschlüsselung. Es ermöglicht Ihnen, eine Verbindung zu einem Server herzustellen, der sich als ein anderer Server ausgeben könnte, was es einem Angreifer ermöglichen könnte, Ihre Kommunikation abzufangen und zu manipulieren. Daher wird davon abgeraten, die Zertifikatsvalidierung in Produktivsystemen zu deaktivieren.
So umgehen Sie die SSL-Zertifikatsvalidierung in Java
Hier ist ein Beispielcode, der zeigt, wie die SSL-Zertifikatsvalidierung in Java umgangen werden kann:
CrunchifyBypassSSLCert.java
Paket crunchify.com.java.tutorials; javax.net.ssl.HttpsURLConnection importieren; javax.net.ssl.SSLContext importieren; javax.net.ssl.TrustManager importieren; javax.net.ssl.X509TrustManager importieren; java.io.BufferedReader importieren; java.io.InputStreamReader importieren; java.net.URL importieren; import java.security.cert.X509Zertifikat; /** * @Autor Crunchify.com * Version: 2.1 * Wie umgeht man die SSL-Zertifikatsprüfung in Java? * */ öffentliche Klasse CrunchifyBypassSSLCert { public static void main(String[] args) { crunchifyDisableCertificateValidation(); crunchifyTestConnection("https://crunchify.com"); } öffentlich statisch void crunchifyDisableCertificateValidation() { versuchen { // SSLContext: Instanzen dieser Klasse repräsentieren eine Secure-Socket-Protokollimplementierung // die als Fabrik für sichere Socket-Factories oder SSLEngines fungiert. // Diese Klasse wird mit einem optionalen Satz von Schlüssel- und Trust-Managern und einer Quelle für sichere Zufallsbytes initialisiert. SSLContext crunchifySSLC = SSLContext.getInstance("TLS"); TrustManager[] trustManagerArray = { new NullX509TrustManager() }; crunchifySSLC.init (null, trustManagerArray, null); HttpsURLConnection.setDefaultSSLSocketFactory(crunchifySSLC.getSocketFactory()); } catch (Ausnahme e) { e.printStackTrace(); } } private statische Klasse NullX509TrustManager implementiert X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) { // nichts tun } public void checkServerTrusted(X509Certificate[] chain, String authType) { // nichts tun } öffentliches X509Zertifikat[] getAcceptedIssuers() { neues X509-Zertifikat [0] zurückgeben; } } public static void crunchifyTestConnection(String crunchifyURL) { versuchen { URL crunchifySiteURL = neue URL (crunchifyURL); // HttpsURLConnection erweitert HttpURLConnection um Unterstützung für https-spezifische Funktionen. HttpsURLConnection connection = (HttpsURLConnection) crunchifySiteURL.openConnection(); Verbindung.connect(); // Abstrakte Klasse für X.509-Zertifikate. // Dies bietet eine Standardmethode für den Zugriff auf alle Attribute eines X.509-Zertifikats. X509Certificate[] certs = (X509Certificate[]) connection.getServerCertificates(); for (X509Certificate cert : certs) { System.out.println("Hier ist ein Zertifikat: " + cert.toString()); } BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; System.out.println("Crunchify-Antwort beginnt: "); while ((inputLine = in.readLine()) != null) { System.out.println (inputLine); } in.close(); System.out.println("Crunchify-Antwortcode: " + connection.getResponseCode()); } catch (Ausnahme e) { e.printStackTrace(); } } }
Der Code erstellt eine benutzerdefinierte TrustManager
Implementierung namens NullX509TrustManager
, die einfach ein leeres Array akzeptierter Aussteller zurückgibt.
Die Methode disableCertificateValidation
legt diesen benutzerdefinierten Trust-Manager als Standard für die HttpsURLConnection
-Klasse fest.
Ergebnis der IntelliJ IDEA-Konsole:
Führen Sie einfach das obige Programm als Java-Anwendung aus und Sie werden das Ergebnis wie unten sehen. Hier drucke ich das Zertifikat für die Website https://crunchify.com
Hier ist ein Zertifikat: [ [ Version: V3 Betreff: CN=crunchify.com, O="Cloudflare, Inc.", L=San Francisco, ST=Kalifornien, C=USA Signaturalgorithmus: SHA256withECDSA, OID = 1.2.840.10045.4.3.2 Schlüssel: Öffentlicher Schlüssel von Sun EC, 256 Bit öffentliche x-Koordinate: 38529685942248262624712688939942529436235652555283274298255011250522606614918 öffentliche Y-Koordinierung: 29334354097022760577193442773858953165938409689794173149697689580356278546401 Parameter: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Gültigkeit: [Ab: Fr 22.07.2022 19:00:00 CDT 2022, An: Sonntag, 23. Juli 18:59:59 CDT 2023] Aussteller: CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US Seriennummer: [ 03c5734c 15f2a24f a8554c49 a0935d45] Zertifikatserweiterungen: 10 [1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Kritikalität=false Erweiterung unbekannt: DER-codierter OCTET-String = 0000: 04 82 01 6E 04 82 01 6A 01 68 00 76 00 AD F7 BE ...n...jhv... 0010: FA 7C FF 10 C8 8B 9D 3D 9C 1E 3E 18 6A B4 67 29 .......=..>.jg) 0020: 5D CF B1 0C 24 CA 85 86 34 EB DC 82 8A 00 00 01 ]...$...4....... 0030: 82 28 D4 6A 70 00 00 04 03 00 47 30 45 02 20 19 .(.jp.....G0E. . 0040: 31 3C 0C 39 7A A9 8E 78 B6 0B B2 37 25 FE 62 23 1<.9z..x...7%.b# 0050: 53 4F 27 75 17 A7 B8 01 FB C4 E6 91 E1 CB 31 02 SO'u...........1. 0060: 21 00 B2 A2 7C 06 26 8E 72 83 02 9A 58 52 0E 31 !.....&.r...XR.1 0070: 99 6F 2C 2A 0C 34 0A B6 34 45 F1 A9 79 A2 4F B7 .o,*.4..4E..yO 0080: 8A DB 00 76 00 35 CF 19 1B BF B1 6C 57 BF 0F AD ...v.5.....lW... 0090: 4C 6D 42 CB BB B6 27 20 26 51 EA 3F E1 2A EF A8 LmB...' &Q.?.*.. 00A0: 03 C3 3B D6 4C 00 00 01 82 28 D4 6A 57 00 00 04 ...;.L....(.jW... 00B0: 03 00 47 30 45 02 20 5F D6 85 1B 65 51 68 C7 BE ..G0E. _...eQh.. 00C0: 5A 77 12 47 98 93 7D F6 18 BB 5E 74 12 62 42 A5 Zw.G......^t.bB. 00D0: 38 95 64 F4 F1 8F CA 02 21 00 DD BD 79 13 78 A7 8.d.....!...yx 00E0: E4 A7 A1 9C 40 C2 2E E0 3E DF 16 9F 70 70 E7 A1 ....@...>...pp.. 00F0: 78 01 16 3D D1 7B 1C E0 60 1E 00 76 00 B7 3E FB x..=....`..v..>. 0100: 24 DF 9C 4D BA 75 F2 39 C5 BA 58 F4 6C 5D FC 42 $..Mu9..Xl].B 0110: CF 7A 9F 35 C4 9E 1D 09 81 25 ED B4 99 00 00 01 .z.5.....%...... 0120: 82 28 D4 6A 5B 00 00 04 03 00 47 30 45 02 21 00 .(.j[.....G0E.!. 0130: AA 7C E3 08 41 E7 3B 84 1B B8 FE 06 4B 7C 83 27 ....A.;.....K..' 0140: CF 4A 81 3F 07 D4 32 FC 69 80 22 D5 DC 06 9B D5 .J.?..2.i."..... 0150: 02 20 0B 50 38 88 53 20 A0 A6 CD 6D 88 37 7C 6D . .P8.S ...m.7.m 0160: E2 E2 8E D9 B1 B7 16 1E A6 EA 38 C2 D3 D7 9B 48 ..........8....H 0170: 34 3C 4< [2]: ObjectId: 1.3.6.1.5.5.7.1.1 Kritikalität=false AuthorityInfoAccess [ [ Zugriffsmethode: ocsp accessLocation: URIName: http://ocsp.digicert.com , accessMethod: caIssuers accessLocation: URIName: http://cacerts.digicert.com/CloudflareIncECCCA-3.crt ] ] [3]: ObjectId: 2.5.29.35 Kritikalität=false AuthorityKeyIdentifier [ KeyIdentifier [ 0000: A5 CE 37 EA EB B0 75 0E 94 67 88 B4 45 FA D9 24 ..7...u..g..E..$ 0010: 10 87 96 1F .... ] ] [4]: ObjectId: 2.5.29.19 Kritikalität=true Grundbedingungen:[ CA: falsch PathLen: undefiniert ] [5]: ObjectId: 2.5.29.31 Kritikalität=false CRLDistributionPoints [ [Verteilungspunkt: [URI-Name: http://crl3.digicert.com/CloudflareIncECCCA-3.crl] , Verteilungspunkt: [URI-Name: http://crl4.digicert.com/CloudflareIncECCCA-3.crl] ]] [6]: ObjectId: 2.5.29.32 Kritikalität=false Zertifikatsrichtlinien [ [CertificatePolicyId: [2.23.140.1.2.2] [PolicyQualifierInfo: [ Qualifikations-ID: 1.3.6.1.5.5.7.2.1 Qualifier: 0000: 16 1B 68 74 74 70 3A 2F 2F 77 77 77 2E 64 69 67 ..http://www.dig 0010: 69 63 65 72 74 2E 63 6F 6D 2F 43 50 53 icert.com/CPS ]] ] ] [7]: ObjectId: 2.5.29.37 Kritikalität=false ExtendedKeyUsages [ serverAuth clientAuth ] [8]: ObjectId: 2.5.29.15 Kritikalität=true Schlüsselverwendung [ Digitale Unterschrift ] [9]: ObjectId: 2.5.29.17 Kritikalität=false BetreffAlternativName [ DNS-Name: *.crunchify.com DNS-Name: crunchify.com ] [10]: ObjectId: 2.5.29.14 Kritikalität=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: CF 6E 31 8C 88 C5 ED 09 6D F6 97 57 CE D4 F0 EC .n1.....m..W.... 0010: B5 FD 99 1A .... ] ] ] Algorithmus: [SHA256withECDSA] Unterschrift: 0000: 30 45 02 20 48 32 9D F1 A0 BA 7A 89 0A 69 0E 5A 0E. H2....z..iZ 0010: D6 50 58 9F B4 89 A8 FF BE A3 BF 3F 80 6E DD F2 .PX........?.n.. 0020: C9 1E BB 04 02 21 00 D3 A8 8F E6 0F 23 E3 59 D7 .....!......#.Y. 0030: 60 3C 74 A7 BF F1 4D 8E 99 0D B9 85 75 15 14 DE `<t...M.....u... 0040: 6D B4 B4 01 BB E2 6F m.....o ] Hier ist ein Zertifikat: [ [ Version: V3 Betreff: CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US Signaturalgorithmus: SHA256withRSA, OID = 1.2.840.113549.1.1.11 Schlüssel: Öffentlicher Schlüssel von Sun EC, 256 Bit öffentliche x-Koordinate: 83984075730615231530440956498748499276900957075036316089284983112230089232319 öffentliche Y-Koordinierung: 84720202049003273739269829519636180374924996951868121119946393481023066512343 Parameter: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Gültigkeit: [Ab: Mo Jan 27 06:48:08 CST 2020, An: Di. 31. Dez. 17:59:59 CST 2024] Aussteller: CN=Baltimore CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE Seriennummer: [ 0a378764 5e5fb48c 224efd1b ed140c3c] Zertifikatserweiterungen: 8 [1]: ObjectId: 1.3.6.1.5.5.7.1.1 Kritikalität=false AuthorityInfoAccess [ [ Zugriffsmethode: ocsp accessLocation: URIName: http://ocsp.digicert.com ] ] [2]: ObjectId: 2.5.29.35 Kritikalität=false AuthorityKeyIdentifier [ KeyIdentifier [ 0000: E5 9D 59 30 82 47 58 CC AC FA 08 54 36 86 7B 3A ..Y0.GX....T6..: 0010: B5 04 4D F0 ..M. ] ] [3]: ObjectId: 2.5.29.19 Kritikalität=true Grundbedingungen:[ CA: stimmt PathLen:0 ] [4]: ObjectId: 2.5.29.31 Kritikalität=false CRLDistributionPoints [ [Verteilungspunkt: [URI-Name: http://crl3.digicert.com/Omniroot2025.crl] ]] [5]: ObjectId: 2.5.29.32 Kritikalität=false Zertifikatsrichtlinien [ [CertificatePolicyId: [2.16.840.1.114412.1.1] [PolicyQualifierInfo: [ Qualifikations-ID: 1.3.6.1.5.5.7.2.1 Qualifier: 0000: 16 1C 68 74 74 70 73 3A 2F 2F 77 77 77 2E 64 69 ..https://www.di 0010: 67 69 63 65 72 74 2E 63 6F 6D 2F 43 50 53 gicert.com/CPS ]] ] [CertificatePolicyId: [2.16.840.1.114412.1.2] [] ] [CertificatePolicyId: [2.23.140.1.2.1] [] ] [CertificatePolicyId: [2.23.140.1.2.2] [] ] [CertificatePolicyId: [2.23.140.1.2.3] [] ] ] [6]: ObjectId: 2.5.29.37 Kritikalität=false ExtendedKeyUsages [ serverAuth clientAuth ] [7]: ObjectId: 2.5.29.15 Kritikalität=true Schlüsselverwendung [ Digitale Unterschrift Key_CertSign Crl_Sign ] [8]: ObjectId: 2.5.29.14 Kritikalität=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: A5 CE 37 EA EB B0 75 0E 94 67 88 B4 45 FA D9 24 ..7...u..g..E..$ 0010: 10 87 96 1F .... ] ] ] Algorithmus: [SHA256withRSA] Unterschrift: 0000: 05 24 1D DD 1B B0 2A EB 98 D6 85 E3 39 4D 5E 6B .$....*.....9M^k 0010: 57 9D 82 57 FC EB E8 31 A2 57 90 65 05 BE 16 44 W..W...1.We..D 0020: 38 5A 77 02 B9 CF 10 42 C6 E1 92 A4 E3 45 27 F8 8Zw....B.....E'. 0030: 00 47 2C 68 A8 56 99 53 54 8F AD 9E 40 C1 D0 0F .G,hVST...@... 0040: B6 D7 0D 0B 38 48 6C 50 2C 49 90 06 5B 64 1D 8B ....8HlP,I..[d.. 0050: CC 48 30 2E DE 08 E2 9B 49 22 C0 92 0C 11 5E 96 .H0.....I"....^. 0060: 92 94 D5 FC 20 DC 56 6C E5 92 93 BF 7A 1C C0 37 .... .Vl....z..7 0070: E3 85 49 15 FA 2B E1 74 39 18 0F B7 DA F3 A2 57 ..I..+.t9......W 0080: 58 60 4F CC 8E 94 00 FC 46 7B 34 31 3E 4D 47 82 X`O.....F.41>MG. 0090: 81 3A CB F4 89 5D 0E EF 4D 0D 6E 9C 1B 82 24 DD .:...]..Mn..$. 00A0: 32 25 5D 11 78 51 10 3D A0 35 23 04 2F 65 6F 9C 2%].xQ.=.5#./eo. 00B0: C1 D1 43 D7 D0 1E F3 31 67 59 27 DD 6B D2 75 09 ..C....1gY'.ku 00C0: 93 11 24 24 14 CF 29 BE E6 23 C3 B8 8F 72 3F E9 ..$$..)..#...r?. 00D0: 07 C8 24 44 53 7A B3 B9 61 65 A1 4C 0E C6 48 00 ..$DSz..ae.L..H. 00E0: C9 75 63 05 87 70 45 52 83 D3 95 9D 45 EA F0 E8 .uc..pER....E... 00F0: 31 1D 7E 09 1F 0A FE 3E DD AA 3C 5E 74 D2 AC B1 1......>..<^t... ]
Die Umgehung der SSL-Zertifikatsvalidierung wird für Produktionssysteme nicht empfohlen, da sie die Sicherheit der SSL/TLS-Verschlüsselung untergräbt.
Es kann jedoch zu Testzwecken erforderlich sein.
Der in diesem Beitrag gezeigte Code zeigt, wie die Zertifikatsvalidierung in Java deaktiviert wird, aber denken Sie daran, dass dies nur zu Testzwecken und nicht in Produktionssystemen verwendet werden sollte.
Lassen Sie mich wissen, wenn bei der Ausführung dieses Codes Probleme auftreten.