Cum să ocoliți verificarea certificatului SSL în Java?
Publicat: 2023-02-08
Secure Sockets Layer (SSL) și Transport Layer Security (TLS) sunt protocoale de criptare care sunt utilizate în mod obișnuit pentru a securiza comunicarea prin internet. Când un client (de exemplu, un browser web) comunică cu un server folosind SSL/TLS, serverul prezintă un certificat pe care clientul îl poate folosi pentru a verifica identitatea serverului. Dacă certificatul nu este valid, clientul va afișa de obicei un avertisment și va refuza să comunice cu serverul.
Cu toate acestea, pot exista momente când trebuie să ocoliți validarea acestui certificat, de exemplu în timpul testării sau când vă conectați la un server intern cu un certificat autosemnat. În această postare, vă vom arăta cum să dezactivați validarea certificatului SSL în Java.
De ce nu este recomandată ocolirea validării certificatului SSL
Ocolirea validării certificatului SSL subminează securitatea criptării SSL/TLS. Vă permite să vă conectați la un server care ar putea uzurpa identitatea unui alt server, ceea ce ar putea permite unui atacator să intercepteze și să modifice comunicarea dvs. Prin urmare, nu este recomandat să dezactivați validarea certificatelor în sistemele de producție.
Cum să ocoliți validarea certificatului SSL în Java
Iată un exemplu de cod care demonstrează cum să ocoliți validarea certificatului SSL în Java:
CrunchifyBypassSSLCert.java
pachet 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; import java.net.URL; import java.security.cert.X509Certificate; /** * @autor Crunchify.com * Versiunea: 2.1 * Cum să ocoliți verificarea certificatului SSL în Java? * */ clasă publică CrunchifyBypassSSLCert { public static void main(String[] args) { crunchifyDisableCertificateValidation(); crunchifyTestConnection("https://crunchify.com"); } public static void crunchifyDisableCertificateValidation() { încerca { // SSLContext: Instanțele acestei clase reprezintă o implementare a protocolului socket securizat // care acționează ca o fabrică pentru fabrici de socket securizate sau SSLEngines. // Această clasă este inițializată cu un set opțional de manageri de chei și de încredere și sursă de octeți aleatori securizați. SSLContext crunchifySSLC = SSLContext.getInstance("TLS"); TrustManager[] trustManagerArray = { nou NullX509TrustManager() }; crunchifySSLC.init(null, trustManagerArray, null); HttpsURLConnection.setDefaultSSLSocketFactory(crunchifySSLC.getSocketFactory()); } prinde (Excepția e) { e.printStackTrace(); } } clasa statică privată NullX509TrustManager implementează X509TrustManager { public void checkClientTrusted(X509Certificate[] lanț, String authType) { // nu face nimic } public void checkServerTrusted(X509Certificate[] lanț, String authType) { // nu face nimic } public X509Certificate[] getAcceptedIssuers() { returnează un nou certificat X509[0]; } } public static void crunchifyTestConnection(String crunchifyURL) { încerca { URL crunchifySiteURL = URL nou (crunchifyURL); // HttpsURLConnection extinde HttpURLConnection cu suport pentru caracteristicile specifice https. Conexiune HttpsURLConnection = (HttpsURLConnection) crunchifySiteURL.openConnection(); connection.connect(); // Clasa abstractă pentru certificatele X.509. // Aceasta oferă o modalitate standard de a accesa toate atributele unui certificat X.509. X509Certificate[] certs = (X509Certificate[]) connection.getServerCertificates(); pentru (X509Certificate cert : certs) { System.out.println("Iată un certificat: " + cert.toString()); } BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; System.out.println("Începe răspunsul crunt: "); în timp ce ((inputLine = in.readLine()) != null) { System.out.println(inputLine); } in.close(); System.out.println("Cod de răspuns Crunchify: " + connection.getResponseCode()); } prinde (Excepția e) { e.printStackTrace(); } } }
Codul creează o implementare personalizată TrustManager
numită NullX509TrustManager
care returnează pur și simplu o matrice goală de emitenți acceptați.
Metoda disableCertificateValidation
setează acest manager personalizat de încredere ca implicit pentru clasa HttpsURLConnection
.
Consola IntelliJ IDEA Rezultat:
Doar rulați programul de mai sus ca o aplicație Java și veți vedea rezultatul ca mai jos. Aici imprim certificatul pentru site-ul https://crunchify.com
Iată un certificat: [ [ Versiunea: V3 Subiect: CN=crunchify.com, O="Cloudflare, Inc.", L=San Francisco, ST=California, C=SUA Algoritm de semnătură: SHA256withECDSA, OID = 1.2.840.10045.4.3.2 Cheie: cheie publică Sun EC, 256 de biți public x coord: 38529685942248262624712688939942529436235652555283274298255011250522606614918 coord public: 29334354097022760577193442773858953165938409689794173149697689580356278546401 parametri: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Valabilitate: [De la: vineri, 22 iulie, 19:00:00 CDT 2022, Către: duminică, 23 iulie 18:59:59 CDT 2023] Emitent: CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US Număr de serie: [ 03c5734c 15f2a24f a8554c49 a0935d45] Extensii de certificat: 10 [1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticitate=fals Extensie necunoscută: șir OCTET codificat 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 Criticitate=fals AuthorityInfoAccess [ [ accessMethod: ocsp accesLocație: Nume URIN: http://ocsp.digicert.com , accessMethod: caissuers accesLocație: Nume URIN: http://cacerts.digicert.com/CloudflareIncECCCA-3.crt ] ] [3]: ObjectId: 2.5.29.35 Criticitate=fals 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 Criticitate=adevărat Constrângeri de bază:[ CA:fals PathLen: nedefinit ] [5]: ObjectId: 2.5.29.31 Criticitate=fals CRLDitributionPoints [ [Punctul de distribuție: [URIName: http://crl3.digicert.com/CloudflareIncECCCA-3.crl] , DistributionPoint: [URIName: http://crl4.digicert.com/CloudflareIncECCCA-3.crl] ]] [6]: ObjectId: 2.5.29.32 Criticitate=fals Politici certificate [ [CertificatePolicyId: [2.23.140.1.2.2] [PolicyQualifierInfo: [ ID calificativ: 1.3.6.1.5.5.7.2.1 calificativ: 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 Criticitate=fals ExtendedKeyUsages [ serverAuth clientAuth ] [8]: ObjectId: 2.5.29.15 Criticity=true KeyUsage [ Semnatura digitala ] [9]: ObjectId: 2.5.29.17 Criticitate=fals SubiectAlternativeName [ DNName: *.crunchify.com DNName: crunchify.com ] [10]: ObjectId: 2.5.29.14 Criticitate=fals 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 .... ] ] ] Algoritm: [SHA256withECDSA] Semnătură: 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 ] Iată un certificat: [ [ Versiunea: V3 Subiect: CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US Algoritm de semnătură: SHA256withRSA, OID = 1.2.840.113549.1.1.11 Cheie: cheie publică Sun EC, 256 de biți public x coord: 83984075730615231530440956498748499276900957075036316089284983112230089232319 coord public: 8472020204900327373926982951963618037492499695186812111994639348102306512343 parametri: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Valabilitate: [De la: Luni 27 ian 06:48:08 CST 2020, Către: marți, 31 decembrie, 17:59:59 CST 2024] Emitent: CN=Baltimore CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE Număr de serie: [ 0a378764 5e5fb48c 224efd1b ed140c3c] Extensii de certificat: 8 [1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticitate=fals AuthorityInfoAccess [ [ accessMethod: ocsp accesLocație: Nume URIN: http://ocsp.digicert.com ] ] [2]: ObjectId: 2.5.29.35 Criticitate=fals 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 Criticitate=adevărat Constrângeri de bază:[ CA: adevărat PathLen:0 ] [4]: ObjectId: 2.5.29.31 Criticitate=fals CRLDitributionPoints [ [Punctul de distribuție: [URIName: http://crl3.digicert.com/Omniroot2025.crl] ]] [5]: ObjectId: 2.5.29.32 Criticitate=fals Politici certificate [ [CertificatePolicyId: [2.16.840.1.114412.1.1] [PolicyQualifierInfo: [ ID calificativ: 1.3.6.1.5.5.7.2.1 calificativ: 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 Criticitate=fals ExtendedKeyUsages [ serverAuth clientAuth ] [7]: ObjectId: 2.5.29.15 Criticity=true KeyUsage [ Semnatura digitala Key_CertSign Crl_Sign ] [8]: ObjectId: 2.5.29.14 Criticitate=fals 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 .... ] ] ] Algoritm: [SHA256withRSA] Semnătură: 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... ]
Ocolirea validării certificatului SSL nu este recomandată pentru sistemele de producție, deoarece subminează securitatea criptării SSL/TLS.

Cu toate acestea, poate fi necesar în scopuri de testare.
Codul afișat în această postare demonstrează cum să dezactivați validarea certificatelor în Java, dar rețineți că aceasta ar trebui folosită numai în scopuri de testare și nu în sistemele de producție.

Anunțați-mă dacă vă confruntați cu vreo problemă la rularea acestui cod.