Come bypassare il controllo del certificato SSL in Java?
Pubblicato: 2023-02-08Secure Sockets Layer (SSL) e Transport Layer Security (TLS) sono protocolli di crittografia comunemente utilizzati per proteggere le comunicazioni su Internet. Quando un client (ad esempio un browser Web) comunica con un server utilizzando SSL/TLS, il server presenta un certificato che il client può utilizzare per verificare l'identità del server. Se il certificato non è valido, il client di solito mostrerà un avviso e si rifiuterà di comunicare con il server.
Tuttavia, a volte potrebbe essere necessario ignorare questa convalida del certificato, ad esempio durante i test o durante la connessione a un server interno con un certificato autofirmato. In questo post, ti mostreremo come disabilitare la convalida del certificato SSL in Java.
Perché non è consigliabile ignorare la convalida del certificato SSL
Bypassare la convalida del certificato SSL compromette la sicurezza della crittografia SSL/TLS. Ti consente di connetterti a un server che potrebbe impersonare un altro server, il che potrebbe consentire a un utente malintenzionato di intercettare e manomettere la tua comunicazione. Pertanto, non è consigliabile disabilitare la convalida del certificato nei sistemi di produzione.
Come bypassare la convalida del certificato SSL in Java
Ecco un codice di esempio che mostra come bypassare la convalida del certificato SSL in Java:
CrunchifyBypassSSLCert.java
pacchetto crunchify.com.java.tutorials; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.BufferedReader; import java.io.InputStreamReader; importa java.net.URL; importare java.security.cert.X509Certificate; /** * @autore Crunchify.com * Versione: 2.1 * Come bypassare il controllo del certificato SSL in Java? * */ classe pubblica CrunchifyBypassSSLCert { public static void main(String[] args) { crunchifyDisableCertificateValidation(); crunchifyTestConnection("https://crunchify.com"); } public static void crunchifyDisableCertificateValidation() { Tentativo { // SSLContext: le istanze di questa classe rappresentano un'implementazione del protocollo socket sicuro // che funge da fabbrica per fabbriche di socket sicuri o SSLEngines. // Questa classe è inizializzata con un set facoltativo di gestori di chiavi e trust e una fonte di byte casuali sicuri. SSLContext crunchifySSLC = SSLContext.getInstance("TLS"); TrustManager[] trustManagerArray = { new NullX509TrustManager() }; crunchifySSLC.init(null, trustManagerArray, null); HttpsURLConnection.setDefaultSSLSocketFactory(crunchifySSLC.getSocketFactory()); } catch (Eccezione e) { e.printStackTrace(); } } classe statica privata NullX509TrustManager implementa X509TrustManager { public void checkClientTrusted(X509Certificate[] catena, String authType) { // fare niente } public void checkServerTrusted(X509Certificate[] catena, String authType) { // fare niente } public X509Certificate[] getAcceptedIssuers() { restituisce il nuovo certificato X509[0]; } } public static void crunchifyTestConnection(String crunchifyURL) { Tentativo { URL crunchifySiteURL = nuovo URL(crunchifyURL); // HttpsURLConnection estende HttpURLConnection con il supporto per le funzionalità specifiche di https. HttpsURLConnection connection = (HttpsURLConnection) crunchifySiteURL.openConnection(); connessione.connessione(); // Classe astratta per i certificati X.509. // Questo fornisce un modo standard per accedere a tutti gli attributi di un certificato X.509. X509Certificate[] certs = (X509Certificate[]) connection.getServerCertificates(); for (X509Certificate cert : certs) { System.out.println("Ecco un certificato: " + cert.toString()); } BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); Stringa inputLine; System.out.println("La risposta di Crunchify inizia: "); while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); } in.chiudi(); System.out.println("Crunchify Response Code: " + connection.getResponseCode()); } catch (Eccezione e) { e.printStackTrace(); } } }
Il codice crea un'implementazione TrustManager
personalizzata denominata NullX509TrustManager
che restituisce semplicemente un array vuoto di emittenti accettate.
Il metodo disableCertificateValidation
imposta questo gestore di attendibilità personalizzato come predefinito per la classe HttpsURLConnection
.
Risultato console IntelliJ IDEA:
Basta eseguire il programma sopra come applicazione Java e vedrai il risultato come di seguito. Qui sto stampando il certificato per il sito https://crunchify.com
Ecco un certificato: [ [ Versione: V3 Oggetto: CN=crunchify.com, O="Cloudflare, Inc.", L=San Francisco, ST=California, C=USA Algoritmo di firma: SHA256 con ECDSA, OID = 1.2.840.10045.4.3.2 Chiave: chiave pubblica Sun EC, 256 bit public x coord: 38529685942248262624712688939942529436235652555283274298255011250522606614918 public e coord: 29334354097022760577193442773858953165938409689794173149697689580356278546401 parametri: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Validità: [Da: ven 22 lug 19:00:00 CDT 2022, A: Dom Jul 23 18:59:59 CDT 2023] Emittente: CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US Numero di serie: [ 03c5734c 15f2a24f a8554c49 a0935d45] Estensioni del certificato: 10 [1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticità=false Estensione sconosciuta: stringa OCTET con codifica 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 LA9 8E 78 SI6 0B SI2 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 DO3 3B RE6 4C 00 00 01 82 28 RE4 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: MI4 LA7 LA1 9C 40 DO2 2E MI0 3E DF 16 9F 70 70 MI7 LA1 ....@...>...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à=falso AutoritàInfoAccesso [ [ accessMetodo: ocsp accessLocation: URIName: http://ocsp.digicert.com , Metodo di accesso: caIssuers accessLocation: URIName: http://cacerts.digicert.com/CloudflareIncECCCA-3.crt ] ] [3]: ObjectId: 2.5.29.35 Criticità=falso IdentificatoreChiaveAutorità [ Identificatore chiave [ 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à=true Vincoli di base:[ CA:falso PathLen: non definito ] [5]: ObjectId: 2.5.29.31 Criticità=falso CRLDistributionPoints [ [Punto di distribuzione: [Nome URI: http://crl3.digicert.com/CloudflareIncECCCA-3.crl] , Punto di distribuzione: [Nome URI: http://crl4.digicert.com/CloudflareIncECCCA-3.crl] ]] [6]: ObjectId: 2.5.29.32 Criticità=false Criteri di certificazione [ [CertificatePolicyId: [2.23.140.1.2.2] [PolicyQualifierInfo: [ ID qualificatore: 1.3.6.1.5.5.7.2.1 qualificatore: 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à=false ExtendedKeyUsages [ serverAuth clientAuth ] [8]: ObjectId: 2.5.29.15 Criticità=true Utilizzo chiave [ Firma digitale ] [9]: ObjectId: 2.5.29.17 Criticità=false NomeAlternativoSoggetto [ Nome DNS: *.crunchify.com Nome DNS: crunchify.com ] [10]: ObjectId: 2.5.29.14 Criticità=false Identificatorechiaveoggetto [ Identificatore chiave [ 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 .... ] ] ] Algoritmo: [SHA256conECDSA] Firma: 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 RE3 LA8 8F MI6 0F 23 MI3 59 RE7 .....!......#.Y. 0030: 60 3C 74 A7 SI F1 4D 8E 99 0D SI9 85 75 15 14 DE `<t...M.....u... 0040: 6D SI4 SI4 01 BB MI2 6F m.....o ] Ecco un certificato: [ [ Versione: V3 Oggetto: CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US Algoritmo di firma: SHA256 con RSA, OID = 1.2.840.113549.1.1.11 Chiave: chiave pubblica Sun EC, 256 bit public x coord: 83984075730615231530440956498748499276900957075036316089284983112230089232319 public e coord: 84720202049003273739269829519636180374924996951868121119946393481023066512343 parametri: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Validità: [Da: lunedì 27 gennaio 06:48:08 CST 2020, A: mar 31 dicembre 17:59:59 CST 2024] Emittente: CN=Baltimora CyberTrust Root, OU=CyberTrust, O=Baltimora, C=IE Numero di serie: [ 0a378764 5e5fb48c 224efd1b ed140c3c] Estensioni del certificato: 8 [1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticità=falso AutoritàInfoAccesso [ [ accessMetodo: ocsp accessLocation: URIName: http://ocsp.digicert.com ] ] [2]: ObjectId: 2.5.29.35 Criticità=false IdentificatoreChiaveAutorità [ Identificatore chiave [ 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 Criticità=true Vincoli di base:[ C.A.: vero PathLen:0 ] [4]: ObjectId: 2.5.29.31 Criticità=false CRLDistributionPoints [ [Punto di distribuzione: [Nome URI: http://crl3.digicert.com/Omniroot2025.crl] ]] [5]: ObjectId: 2.5.29.32 Criticità=false Criteri di certificazione [ [CertificatePolicyId: [2.16.840.1.114412.1.1] [PolicyQualifierInfo: [ ID qualificatore: 1.3.6.1.5.5.7.2.1 qualificatore: 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 Criticità=false ExtendedKeyUsages [ serverAuth clientAuth ] [7]: ObjectId: 2.5.29.15 Criticità=true Utilizzo chiave [ Firma digitale Key_CertSign Crl_Sign ] [8]: ObjectId: 2.5.29.14 Criticità=false Identificatorechiaveoggetto [ Identificatore chiave [ 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 .... ] ] ] Algoritmo: [SHA256conRSA] Firma: 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 SI9 CF 10 42 DO6 MI1 92 LA4 MI3 45 27 FA8 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 LA0 35 23 04 2F 65 6F 9C 2%].xQ.=.5#./eo. 00B0: DO1 RE1 43 RE7 RE0 1E F3 31 67 59 27 DD 6B RE2 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: DO9 75 63 05 87 70 45 52 83 RE3 95 9RE 45 MI FA0 MI8 .uc..pER....E... 00F0: 31 1D 7E 09 1F 0A FE 3E DD AA 3C 5E 74 D2 AC B1 1......>..<^t... ]
L'esclusione della convalida del certificato SSL non è consigliata per i sistemi di produzione perché compromette la sicurezza della crittografia SSL/TLS.
Tuttavia, potrebbe essere necessario per scopi di test.
Il codice mostrato in questo post mostra come disabilitare la convalida del certificato in Java, ma tieni presente che questo dovrebbe essere utilizzato solo a scopo di test e non nei sistemi di produzione.
Fammi sapere se riscontri problemi durante l'esecuzione di questo codice.