Comment contourner la vérification des certificats SSL en Java ?

Publié: 2023-02-08
Comment contourner la vérification des certificats SSL en Java ?

Secure Sockets Layer (SSL) et Transport Layer Security (TLS) sont des protocoles de cryptage couramment utilisés pour sécuriser les communications sur Internet. Lorsqu'un client (par exemple un navigateur Web) communique avec un serveur à l'aide de SSL/TLS, le serveur présente un certificat que le client peut utiliser pour vérifier l'identité du serveur. Si le certificat n'est pas valide, le client affichera généralement un avertissement et refusera de communiquer avec le serveur.

Cependant, il peut arriver que vous deviez contourner cette validation de certificat, par exemple lors de tests ou lors de la connexion à un serveur interne avec un certificat auto-signé. Dans cet article, nous vous montrerons comment désactiver la validation du certificat SSL en Java.

Pourquoi contourner la validation du certificat SSL n'est pas recommandé

Le contournement de la validation du certificat SSL compromet la sécurité du chiffrement SSL/TLS. Il vous permet de vous connecter à un serveur qui pourrait se faire passer pour un autre serveur, ce qui pourrait permettre à un attaquant d'intercepter et de falsifier votre communication. Par conséquent, il n'est pas recommandé de désactiver la validation des certificats dans les systèmes de production.

Comment contourner la validation du certificat SSL en Java

Voici un exemple de code qui montre comment contourner la validation du certificat SSL en Java :

CrunchifyBypassSSLCert.java

 package crunchify.com.java.tutorials ;

importer javax.net.ssl.HttpsURLConnection ;
importer javax.net.ssl.SSLContext ;
importer javax.net.ssl.TrustManager ;
importer javax.net.ssl.X509TrustManager ;
importer java.io.BufferedReader ;
importer java.io.InputStreamReader ;
importer java.net.URL ;
importer java.security.cert.X509Certificate ;

/**
 * @author Crunchify.com
 *Version : 2.1
 * Comment contourner la vérification des certificats SSL en Java ?
 *
 */

classe publique CrunchifyBypassSSLCert {

	public static void main(String[] args) {
		crunchifyDisableCertificateValidation();
		crunchifyTestConnection("https://crunchify.com");
	}
	public static void crunchifyDisableCertificateValidation() {
		essayer {

			// SSLContext : les instances de cette classe représentent une implémentation du protocole de socket sécurisé
			// qui agit comme une fabrique pour les fabriques de sockets sécurisés ou SSLEngines.
			// Cette classe est initialisée avec un ensemble facultatif de gestionnaires de clés et de confiance et une source d'octets aléatoires sécurisés.
			SSLContext crunchifySSLC = SSLContext.getInstance("TLS");
			TrustManager[] trustManagerArray = { new NullX509TrustManager() } ;
			crunchifySSLC.init(null, trustManagerArray, null);
			HttpsURLConnection.setDefaultSSLSocketFactory(crunchifySSLC.getSocketFactory());

		} capture (Exception e) {
			e.printStackTrace();
		}
	}

	classe statique privée NullX509TrustManager implémente X509TrustManager {
		public void checkClientTrusted(X509Certificate[] chain, String authType) {
			// ne fais rien
		}

		public void checkServerTrusted (chaîne X509Certificate[], chaîne authType) {
			// ne fais rien
		}

		public X509Certificate[] getAcceptedIssuers() {
			renvoie le nouveau X509Certificate[0] ;
		}
	}


	public static void crunchifyTestConnection(String crunchifyURL) {
		essayer {
			URL crunchifySiteURL = nouvelle URL (crunchifyURL);

			// HttpsURLConnection étend HttpURLConnection avec la prise en charge des fonctionnalités spécifiques à https.
			Connexion HttpsURLConnection = (HttpsURLConnection) crunchifySiteURL.openConnection();
			connexion.connect();

			// Classe abstraite pour les certificats X.509.
			// Cela fournit un moyen standard d'accéder à tous les attributs d'un certificat X.509.
			X509Certificate[] certs = (X509Certificate[]) connection.getServerCertificates();
			pour (certificat X509certificat : certificats) {
				System.out.println("Voici un certificat : " + cert.toString());
			}

			BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			chaîne inputLine ;

			System.out.println("Crunchify Response Starts: ");
			tandis que ((inputLine = in.readLine()) != null) {
				System.out.println(inputLine);
			}
			joindre();

			System.out.println("Crunchifier le code de réponse : " + connection.getResponseCode());
		} capture (Exception e) {
			e.printStackTrace();
		}
	}
}

Le code crée une implémentation TrustManager personnalisée appelée NullX509TrustManager qui renvoie simplement un tableau vide d'émetteurs acceptés.

La méthode disableCertificateValidation définit ce gestionnaire de confiance personnalisé comme gestionnaire par défaut pour la classe HttpsURLConnection .

Résultat de la console IntelliJ IDEA :

Exécutez simplement le programme ci-dessus en tant qu'application Java et vous verrez le résultat ci-dessous. Ici, j'imprime un certificat pour le site https://crunchify.com

 Voici un certificat : [
[
  Version : V3
  Objet : CN=crunchify.com, O="Cloudflare, Inc.", L=San Francisco, ST=Californie, C=États-Unis
  Algorithme de signature : SHA256 avec ECDSA, OID = 1.2.840.10045.4.3.2

  Clé : Clé publique Sun EC, 256 bits
  public x coord: 38529685942248262624712688939942529436235652555283274298255011250522606614918
  public et coord: 29334354097022760577193442773858953165938409689794173149697689580356278546401
  paramètres : secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)
  Validité : [À partir du : ven. 22 juillet 19:00:00 CDT 2022,
               À : dim. 23 juillet 18:59:59 HAC 2023]
  Émetteur : CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US
  Numéro de série : [ 03c5734c 15f2a24f a8554c49 a0935d45]

Extensions de certificat : 10
[1] : ObjectId : 1.3.6.1.4.1.11129.2.4.2 Criticité=faux
Extension inconnue : chaîne OCTET encodée en DER =
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 Criticité=faux
AccèsInfoAutorité [
  [
   méthode d'accès : ocsp
   accessLocation : URIName : http://ocsp.digicert.com
, 
   accessMethod : caIssuers
   accessLocation : URIName : http://cacerts.digicert.com/CloudflareIncECCCA-3.crt
]
]

[3] : ObjectId : 2.5.29.35 Criticité=faux
IdentifiantCléAutorité [
Identifiant de clé [
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 Criticité=vrai
Contraintes de base :[
  Autorité de certification : faux
  PathLen : non défini
]

[5] : ObjectId : 2.5.29.31 Criticité=false
CRLDistributionPoints [
  [Point de Distribution :
     [URIName : http://crl3.digicert.com/CloudflareIncECCCA-3.crl]
, point de distribution :
     [URIName : http://crl4.digicert.com/CloudflareIncECCCA-3.crl]
]]

[6] : ObjectId : 2.5.29.32 Criticité=faux
Politiquesdecertificat [
  [CertificatePolicyId : [2.23.140.1.2.2]
[Informations sur le qualificatif de politique : [
  qualificatif : 1.3.6.1.5.5.7.2.1
  qualificatif : 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 Criticité=faux
Utilisations de clé étendues [
  serverAuth
  clientAuth
]

[8] : ObjectId : 2.5.29.15 Criticité=vrai
Utilisation de la clé [
  Signature numérique
]

[9] : ObjectId : 2.5.29.17 Criticité=faux
NomAlternatifSujet [
  Nom DNS : *.crunchify.com
  Nom DNS : crunchify.com
]

[10] : ObjectId : 2.5.29.14 Criticité=faux
Identifiant de la clé du sujet [
Identifiant de clé [
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 ....
]
]

]
  Algorithme : [SHA256avec ECDSA]
  Signature:
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

]
Voici un certificat : [
[
  Version : V3
  Objet : CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US
  Algorithme de signature : SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Clé : Clé publique Sun EC, 256 bits
  public x coord: 83984075730615231530440956498748499276900957075036316089284983112230089232319
  public et coord: 84720202049003273739269829519636180374924996951868121119946393481023066512343
  paramètres : secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)
  Validité : [À partir du : lundi 27 janvier 06:48:08 CST 2020,
               À : mar. 31 décembre 17:59:59 CST 2024]
  Émetteur : CN=Baltimore CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE
  Numéro de série : [ 0a378764 5e5fb48c 224efd1b ed140c3c]

Extensions de certificat : 8
[1] : ObjectId : 1.3.6.1.5.5.7.1.1 Criticité=faux
AccèsInfoAutorité [
  [
   méthode d'accès : ocsp
   accessLocation : URIName : http://ocsp.digicert.com
]
]

[2] : ObjectId : 2.5.29.35 Criticité=faux
IdentifiantCléAutorité [
Identifiant de clé [
0000 : E5 9D 59 30 82 47 58 CC CA FA 08 54 36 86 7B 3A ..Y0.GX....T6.. :
0010 : B5 04 4D F0 ..M.
]
]

[3] : ObjectId : 2.5.29.19 Criticité=vrai
Contraintes de base :[
  Autorité de certification : vrai
  CheminLen:0
]

[4] : ObjectId : 2.5.29.31 Criticité=false
CRLDistributionPoints [
  [Point de Distribution :
     [URIName : http://crl3.digicert.com/Omniroot2025.crl]
]]

[5] : ObjectId : 2.5.29.32 Criticité=faux
Politiquesdecertificat [
  [CertificatePolicyId : [2.16.840.1.114412.1.1]
[Informations sur le qualificatif de politique : [
  qualificatif : 1.3.6.1.5.5.7.2.1
  qualificatif : 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]
[] ]
  [Identifiant de la politique de certificat : [2.23.140.1.2.1]
[] ]
  [CertificatePolicyId : [2.23.140.1.2.2]
[] ]
  [Identifiant de la politique de certificat : [2.23.140.1.2.3]
[] ]
]

[6] : ObjectId : 2.5.29.37 Criticité=faux
Utilisations de clé étendues [
  serverAuth
  clientAuth
]

[7] : ObjectId : 2.5.29.15 Criticité=vrai
Utilisation de la clé [
  Signature numérique
  Key_CertSign
  Crl_Sign
]

[8] : ObjectId : 2.5.29.14 Criticité=faux
Identifiant de la clé du sujet [
Identifiant de clé [
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 ....
]
]

]
  Algorithme : [SHA256avecRSA]
  Signature:
0000 : 05 24 1D JJ 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...

]

Le contournement de la validation du certificat SSL n'est pas recommandé pour les systèmes de production, car cela compromet la sécurité du chiffrement SSL/TLS.

Cependant, cela peut être nécessaire à des fins de test.

Le code présenté dans cet article montre comment désactiver la validation des certificats en Java, mais gardez à l'esprit que cela ne doit être utilisé qu'à des fins de test et non dans les systèmes de production.

Pourquoi contourner la validation du certificat SSL n'est pas recommandé

Faites-moi savoir si vous rencontrez un problème lors de l'exécution de ce code.