Wie umgeht man die SSL-Zertifikatsprüfung in Java?

Veröffentlicht: 2023-02-08
Wie umgeht man die SSL-Zertifikatsprüfung in Java?

Secure 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.

Warum das Umgehen der SSL-Zertifikatvalidierung nicht empfohlen wird

Lassen Sie mich wissen, wenn bei der Ausführung dieses Codes Probleme auftreten.