Cum să ocoliți verificarea certificatului SSL în Java?

Publicat: 2023-02-08
Cum să ocoliți verificarea certificatului SSL în Java?

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.

De ce nu este recomandată ocolirea validării certificatului SSL

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