Java에서 SSL 인증서 확인을 우회하는 방법은 무엇입니까?

게시 됨: 2023-02-08
Java에서 SSL 인증서 확인을 우회하는 방법은 무엇입니까?

SSL(Secure Sockets Layer) 및 TLS(Transport Layer Security)는 인터넷을 통한 보안 통신에 일반적으로 사용되는 암호화 프로토콜입니다. 클라이언트(예: 웹 브라우저)가 SSL/TLS를 사용하여 서버와 통신할 때 서버는 클라이언트가 서버의 ID를 확인하는 데 사용할 수 있는 인증서를 제공합니다. 인증서가 유효하지 않으면 클라이언트는 일반적으로 경고를 표시하고 서버와의 통신을 거부합니다.

그러나 테스트 중이나 자체 서명된 인증서로 내부 서버에 연결할 때와 같이 이 인증서 유효성 검사를 우회해야 하는 경우가 있을 수 있습니다. 이 게시물에서는 Java에서 SSL 인증서 유효성 검사를 비활성화하는 방법을 보여줍니다.

SSL 인증서 유효성 검사를 우회하는 것이 권장되지 않는 이유

SSL 인증서 유효성 검사를 우회하면 SSL/TLS 암호화의 보안이 약화됩니다. 이를 통해 다른 서버를 가장할 수 있는 서버에 연결할 수 있으므로 공격자가 통신을 가로채고 변조할 수 있습니다. 따라서 프로덕션 시스템에서 인증서 유효성 검사를 비활성화하지 않는 것이 좋습니다.

Java에서 SSL 인증서 유효성 검사를 우회하는 방법

다음은 Java에서 SSL 인증서 유효성 검사를 우회하는 방법을 보여주는 예제 코드입니다.

CrunchifyBypassSSLCert.java

 패키지 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;

/**
 * @author Crunchify.com
 * 버전: 2.1
 * Java에서 SSL 인증서 확인을 우회하는 방법은 무엇입니까?
 *
 */

공개 클래스 CrunchifyBypassSSLCert {

	공개 정적 무효 메인(문자열[] 인수) {
		crunchifyDisableCertificateValidation();
		crunchifyTestConnection("https://crunchify.com");
	}
	공공 정적 무효 crunchifyDisableCertificateValidation() {
		노력하다 {

			// SSLContext: 이 클래스의 인스턴스는 보안 소켓 프로토콜 구현을 나타냅니다.
			// 보안 소켓 팩토리 또는 SSLEngines의 팩토리 역할을 합니다.
			// 이 클래스는 선택적 키 및 신뢰 관리자 세트와 보안 임의 바이트 소스로 초기화됩니다.
			SSLContext crunchifySSLC = SSLContext.getInstance("TLS");
			TrustManager[] trustManagerArray = { new NullX509TrustManager() };
			crunchifySSLC.init(null, trustManagerArray, null);
			HttpsURLConnection.setDefaultSSLSocketFactory(crunchifySSLC.getSocketFactory());

		} 잡기(예외 e) {
			e.printStackTrace();
		}
	}

	개인 정적 클래스 NullX509TrustManager는 X509TrustManager를 구현합니다. {
		공공 무효 checkClientTrusted(X509Certificate[] 체인, String authType) {
			// 아무것도하지 마세요
		}

		공공 무효 checkServerTrusted(X509Certificate[] 체인, String authType) {
			// 아무것도하지 마세요
		}

		공개 X509Certificate[] getAcceptedIssuers() {
			새 X509Certificate[0] 반환;
		}
	}


	공개 정적 무효 crunchifyTestConnection(문자열 crunchifyURL) {
		노력하다 {
			URL crunchifySiteURL = 새 URL(crunchifyURL);

			// HttpsURLConnection은 https 관련 기능을 지원하여 HttpURLConnection을 확장합니다.
			HttpsURLConnection 연결 = (HttpsURLConnection) crunchifySiteURL.openConnection();
			연결.연결();

			// X.509 인증서에 대한 추상 클래스입니다.
			// 이것은 X.509 인증서의 모든 속성에 액세스하는 표준 방법을 제공합니다.
			X509Certificate[] 인증서 = (X509Certificate[]) connection.getServerCertificates();
			for (X509Certificate 인증서: 인증서) {
				System.out.println("다음은 인증서입니다: " + cert.toString());
			}

			BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			문자열 inputLine;

			System.out.println("Crunchify 응답 시작: ");
			동안 ((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=샌프란시스코, ST=캘리포니아, 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)
  유효 기간: [시작: 2022년 7월 22일 금요일 19:00:00 CDT,
               도착: 2023년 7월 23일 일요일 18:59:59 CDT]
  발급자: 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 중요도=거짓
알 수 없는 확장자: 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. _...에크..
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 중요도=거짓
AuthorityInfoAccess [
  [
   액세스 방법: ocsp
   accessLocation: URI 이름: http://ocsp.digicert.com
, 
   액세스 방법: caIssuers
   accessLocation: URI 이름: http://cacerts.digicert.com/CloudflareIncECCCA-3.crt
]
]

[3]: ObjectId: 2.5.29.35 중요도=거짓
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 중요도=참
기본 제약 조건:[
  CA:거짓
  PathLen: 정의되지 않음
]

[5]: ObjectId: 2.5.29.31 중요도=거짓
CRLDistributionPoints [
  [배포지점:
     [URI이름: http://crl3.digicert.com/CloudflareIncECCCA-3.crl]
, 배포 지점:
     [URI이름: http://crl4.digicert.com/CloudflareIncECCCA-3.crl]
]]

[6]: ObjectId: 2.5.29.32 중요도=거짓
인증서 정책 [
  [CertificatePolicyId: [2.23.140.1.2.2]
[PolicyQualifierInfo: [
  한정자 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 중요도=거짓
ExtendedKeyUsages [
  서버 인증
  클라이언트 인증
]

[8]: ObjectId: 2.5.29.15 중요도=참
KeyUsage [
  전자 서명
]

[9]: ObjectId: 2.5.29.17 중요도=거짓
제목 대체 이름 [
  DNS 이름: *.crunchify.com
  DNS 이름: crunchify.com
]

[10]: ObjectId: 2.5.29.14 중요도=거짓
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 CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE
  일련번호: [ 0a378764 5e5fb48c 224efd1b ed140c3c]

인증서 확장: 8
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 중요도=거짓
AuthorityInfoAccess [
  [
   액세스 방법: ocsp
   accessLocation: URI 이름: http://ocsp.digicert.com
]
]

[2]: ObjectId: 2.5.29.35 중요도=거짓
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 중요도=참
기본 제약 조건:[
  CA:참
  경로 길이:0
]

[4]: ObjectId: 2.5.29.31 중요도=거짓
CRLDistributionPoints [
  [배포지점:
     [URI이름: http://crl3.digicert.com/Omniroot2025.crl]
]]

[5]: ObjectId: 2.5.29.32 중요도=거짓
인증서 정책 [
  [CertificatePolicyId: [2.16.840.1.114412.1.1]
[PolicyQualifierInfo: [
  한정자 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 중요도=거짓
ExtendedKeyUsages [
  서버 인증
  클라이언트 인증
]

[7]: ObjectId: 2.5.29.15 중요도=참
KeyUsage [
  전자 서명
  Key_CertSign
  Crl_Sign
]

[8]: ObjectId: 2.5.29.14 중요도=거짓
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 광고 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 인증서 유효성 검사를 우회하는 것이 권장되지 않는 이유

이 코드를 실행하는 데 문제가 있으면 알려주세요.