Comment contourner la vérification des certificats SSL en Java ?
Publié: 2023-02-08Secure 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.
Faites-moi savoir si vous rencontrez un problème lors de l'exécution de ce code.