如何繞過 Java 中的 SSL 證書檢查?

已發表: 2023-02-08
如何繞過 Java 中的 SSL 證書檢查?

安全套接字層 (SSL) 和傳輸層安全性 (TLS) 是通常用於保護 Internet 通信安全的加密協議。 當客戶端(例如網絡瀏覽器)使用 SSL/TLS 與服務器通信時,服務器會提供一個證書,客戶端可以使用該證書來驗證服務器的身份。 如果證書無效,客戶端通常會顯示警告並拒絕與服務器通信。

但是,有時您可能需要繞過此證書驗證,例如在測試期間或使用自簽名證書連接到內部服務器時。 在本文中,我們將向您展示如何在 Java 中禁用 SSL 證書驗證。

為什麼不推薦繞過 SSL 證書驗證

繞過 SSL 證書驗證會破壞 SSL/TLS 加密的安全性。 它允許您連接到可能冒充另一台服務器的服務器,這可能允許攻擊者攔截和篡改您的通信。 因此,不建議在生產系統中禁用證書驗證。

如何繞過 Java 中的 SSL 證書驗證

以下示例代碼演示瞭如何繞過 Java 中的 SSL 證書驗證:

CrunchifyBypassSSLCert.java

 包 crunchify.com.java.tutorials;

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

/**
 * @author Crunchify.com
 *版本:2.1
 * 如何繞過 Java 中的 SSL 證書檢查?
 *
 */

公共類 CrunchifyBypassSSLCert {

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

			// SSLContext: 此類的實例表示安全套接字協議實現
			// 作為安全套接字工廠或 SSLEngine 的工廠。
			// 此類使用一組可選的密鑰和信任管理器以及安全隨機字節源進行初始化。
			SSLContext crunchifySSLC = SSLContext.getInstance("TLS");
			TrustManager[] trustManagerArray = { new NullX509TrustManager() };
			crunchifySSLC.init(null, trustManagerArray, null);
			HttpsURLConnection.setDefaultSSLSocketFactory(crunchifySSLC.getSocketFactory());

		} 趕上(異常 e){
			e.printStackTrace();
		}
	}

	私有靜態類 NullX509TrustManager 實現 X509TrustManager {
		public void checkClientTrusted(X509Certificate[] chain, String authType) {
			// 沒做什麼
		}

		public void checkServerTrusted(X509Certificate[] chain, String authType) {
			// 沒做什麼
		}

		公共 X509Certificate[] getAcceptedIssuers() {
			返回新的 X509Certificate[0];
		}
	}


	public static void crunchifyTestConnection(String crunchifyURL) {
		嘗試 {
			URL crunchifySiteURL = 新 URL(crunchifyURL);

			// HttpsURLConnection 擴展了 HttpURLConnection 以支持 https 特定的功能。
			HttpsURLConnection 連接 = (HttpsURLConnection) crunchifySiteURL.openConnection();
			連接.connect();

			// X.509 證書的抽像類。
			// 這提供了一種訪問 X.509 證書所有屬性的標準方法。
			X509Certificate[] certs = (X509Certificate[]) connection.getServerCertificates();
			對於(X509Certificate 證書:證書){
				System.out.println("這是一個證書:" + cert.toString());
			}

			BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			字符串輸入線;

			System.out.println("Crunchify 響應開始:");
			while ((inputLine = in.readLine()) != null) {
				System.out.println(inputLine);
			}
			附寄();

			System.out.println("Crunchify 響應代碼:" + connection.getResponseCode());
		} 趕上(異常 e){
			e.printStackTrace();
		}
	}
}

該代碼創建了一個名為NullX509TrustManager的自定義TrustManager實現,它只返回一個已接受發行者的空數組。

disableCertificateValidation方法將此自定義信任管理器設置為HttpsURLConnection類的默認值。

IntelliJ IDEA 控制台結果:

只需將上面的程序作為 Java 應用程序運行,您將看到如下結果。 在這裡,我正在為網站 https://crunchify.com 打印證書

這是證書:[
[
  版本:V3
  主題:CN=crunchify.com, O="Cloudflare, Inc.", L=San Francisco, ST=California, C=US
  簽名算法:SHA256withECDSA,OID = 1.2.840.10045.4.3.2

  密鑰:Sun EC 公鑰,256 位
  公共 x 坐標:38529685942248262624712688939942529436235652555283274298255011250522606614918
  公共 y 坐標:29334354097022760577193442773858953165938409689794173149697689580356278546401
  參數:secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)
  有效期:[自:CDT 2022 年 7 月 22 日星期五 19:00:00,
               收件人:CDT 2023 年 7 月 23 日星期日 18:59:59]
  發行人:CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US
  序列號:[ 03c5734c 15f2a24f a8554c49 a0935d45]

證書擴展:10
[1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticality=false
擴展名未知:DER 編碼的 OCTET 字符串 =
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 Criticality=false
權限信息訪問 [
  [
   訪問方法:ocsp
   訪問位置:URIName:http://ocsp.digicert.com
, 
   accessMethod: 發行人
   訪問位置:URIName:http://cacerts.digicert.com/CloudflareIncECCCA-3.crt
]
]

[3]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
密鑰標識符 [
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 Criticality=true
基本約束:[
  加州:假
  路徑長度:未定義
]

[5]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [分發點:
     [URI 名稱:http://crl3.digicert.com/CloudflareIncECCCA-3.crl]
,分佈點:
     [URI 名稱:http://crl4.digicert.com/CloudflareIncECCCA-3.crl]
]]

[6]: ObjectId: 2.5.29.32 Criticality=false
證書策略 [
  [CertificatePolicyId: [2.23.140.1.2.2]
[策略限定符信息:[
  限定符 ID:1.3.6.1.5.5.7.2.1
  限定符: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 Criticality=false
擴展密鑰使用 [
  服務器認證
  客戶端認證
]

[8]: ObjectId: 2.5.29.15 Criticality=true
鍵用法 [
  電子簽名
]

[9]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNS 名稱:*.crunchify.com
  DNS 名稱:crunchify.com
]

[10]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
密鑰標識符 [
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 ....
]
]

]
  算法:[SHA256withECDSA]
  簽名:
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

]
這是證書:[
[
  版本:V3
  主題:CN=Cloudflare Inc ECC CA-3, O="Cloudflare, Inc.", C=US
  簽名算法:SHA256withRSA,OID = 1.2.840.113549.1.1.11

  密鑰:Sun EC 公鑰,256 位
  公共 x 坐標:83984075730615231530440956498748499276900957075036316089284983112230089232319
  公共 y 坐標:84720202049003273739269829519636180374924996951868121119946393481023066512343
  參數:secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)
  有效期:[來自:2020 年 1 月 27 日星期一 06:48:08 CST,
               收件人:2024 年 12 月 31 日星期二 17:59:59 CST]
  發行人:CN=Baltimore Cyber​​Trust Root,OU=Cyber​​Trust,O=Baltimore,C=IE
  序列號:[ 0a378764 5e5fb48c 224efd1b ed140c3c]

證書擴展:8
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
權限信息訪問 [
  [
   訪問方法:ocsp
   訪問位置:URIName:http://ocsp.digicert.com
]
]

[2]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
密鑰標識符 [
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 Criticality=true
基本約束:[
  加州:真
  路徑長度:0
]

[4]: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
  [分發點:
     [URI 名稱:http://crl3.digicert.com/Omniroot2025.crl]
]]

[5]: ObjectId: 2.5.29.32 Criticality=false
證書策略 [
  [CertificatePolicyId: [2.16.840.1.114412.1.1]
[策略限定符信息:[
  限定符 ID:1.3.6.1.5.5.7.2.1
  限定符: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 Criticality=false
擴展密鑰使用 [
  服務器認證
  客戶端認證
]

[7]: ObjectId: 2.5.29.15 Criticality=true
鍵用法 [
  電子簽名
  Key_CertSign
  Crl_Sign
]

[8]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
密鑰標識符 [
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 ....
]
]

]
  算法:[SHA256withRSA]
  簽名:
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...

]

不建議對生產系統繞過 SSL 證書驗證,因為它會破壞 SSL/TLS 加密的安全性。

但是,出於測試目的,這可能是必要的。

這篇文章中顯示的代碼演示瞭如何在 Java 中禁用證書驗證,但請記住,這應該僅用於測試目的,而不應用於生產系統。

為什麼不推薦繞過 SSL 證書驗證

如果您在運行此代碼時遇到任何問題,請告訴我。