จะข้ามการตรวจสอบใบรับรอง SSL ใน Java ได้อย่างไร
เผยแพร่แล้ว: 2023-02-08Secure Sockets Layer (SSL) และ Transport Layer Security (TLS) เป็นโปรโตคอลการเข้ารหัสที่ใช้กันทั่วไปเพื่อรักษาความปลอดภัยในการสื่อสารผ่านอินเทอร์เน็ต เมื่อไคลเอ็นต์ (เช่น เว็บเบราว์เซอร์) สื่อสารกับเซิร์ฟเวอร์โดยใช้ SSL/TLS เซิร์ฟเวอร์จะแสดงใบรับรองที่ไคลเอ็นต์สามารถใช้เพื่อตรวจสอบตัวตนของเซิร์ฟเวอร์ได้ หากใบรับรองไม่ถูกต้อง ไคลเอนต์มักจะแสดงคำเตือนและปฏิเสธที่จะสื่อสารกับเซิร์ฟเวอร์
อย่างไรก็ตาม อาจมีบางครั้งที่คุณจำเป็นต้องข้ามการตรวจสอบใบรับรองนี้ เช่น ระหว่างการทดสอบหรือเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ภายในด้วยใบรับรองที่ลงนามด้วยตนเอง ในโพสต์นี้ เราจะแสดงวิธีปิดใช้งานการตรวจสอบใบรับรอง SSL ใน Java
เหตุใดจึงไม่แนะนำให้ข้ามการตรวจสอบใบรับรอง SSL
การข้ามการตรวจสอบใบรับรอง SSL จะทำลายความปลอดภัยของการเข้ารหัส SSL/TLS ช่วยให้คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ที่อาจแอบอ้างเป็นเซิร์ฟเวอร์อื่น ซึ่งอาจทำให้ผู้โจมตีสามารถสกัดกั้นและยุ่งเกี่ยวกับการสื่อสารของคุณได้ ดังนั้นจึงไม่แนะนำให้ปิดใช้งานการตรวจสอบใบรับรองในระบบที่ใช้งานจริง
วิธีข้ามการตรวจสอบใบรับรอง SSL ใน Java
ต่อไปนี้คือโค้ดตัวอย่างที่สาธิตวิธีข้ามการตรวจสอบใบรับรอง SSL ใน Java:
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; /** * @ผู้เขียน Crunchify.com * เวอร์ชัน: 2.1 * จะข้ามการตรวจสอบใบรับรอง SSL ใน Java ได้อย่างไร * */ CrunchifyBypassSSLCert คลาสสาธารณะ { โมฆะสาธารณะคงที่ main(String[] args) { crunchifyDisableCertificateValidation(); crunchifyTestConnection("https://crunchify.com"); } โมฆะสาธารณะคงที่ crunchifyDisableCertificateValidation () { พยายาม { // SSLContext: อินสแตนซ์ของคลาสนี้แสดงถึงการใช้งานโปรโตคอลซ็อกเก็ตที่ปลอดภัย // ซึ่งทำหน้าที่เป็นโรงงานสำหรับโรงงานซ็อกเก็ตที่ปลอดภัยหรือ SSLEngines // คลาสนี้เริ่มต้นด้วยชุดตัวเลือกของคีย์และตัวจัดการความน่าเชื่อถือ และแหล่งที่มาของไบต์สุ่มที่ปลอดภัย SSLContext crunchifySSLC = SSLContext.getInstance("TLS"); TrustManager[] trustManagerArray = { ใหม่ NullX509TrustManager () }; crunchifySSLC.init (null, trustManagerArray, null); HttpsURLConnection.setDefaultSSLSocketFactory(กระทืบSSLC.getSocketFactory()); } catch (ข้อยกเว้น e) { e.printStackTrace(); } } คลาสสแตติกส่วนตัว NullX509TrustManager ใช้ X509TrustManager { โมฆะสาธารณะ checkClientTrusted (X509Certificate [] chain, String authType) { // ไม่ทำอะไร } โมฆะสาธารณะ checkServerTrusted (X509Certificate [] chain, String authType) { // ไม่ทำอะไร } X509Certificate สาธารณะ [] getAcceptedIssuers () { ส่งคืน X509Certificate[0] ใหม่; } } โมฆะสาธารณะคงที่ crunchifyTestConnection (String crunchifyURL) { พยายาม { URL crunchifySiteURL = URL ใหม่ (crunchifyURL); // HttpsURLConnection ขยาย HttpURLConnection ด้วยการรองรับคุณสมบัติเฉพาะของ https การเชื่อมต่อ HttpsURLConnection = (HttpsURLConnection) crunchifySiteURL.openConnection (); การเชื่อมต่อ การเชื่อมต่อ (); // คลาสนามธรรมสำหรับใบรับรอง X.509 // นี่เป็นวิธีมาตรฐานในการเข้าถึงแอตทริบิวต์ทั้งหมดของใบรับรอง X.509 X509Certificate[] ใบรับรอง = (X509Certificate[]) connection.getServerCertificates(); สำหรับ (ใบรับรอง X509Certificate : ใบรับรอง) { System.out.println("นี่คือใบรับรอง:" + cert.toString()); } BufferedReader ใน = BufferedReader ใหม่ (InputStreamReader ใหม่ (connection.getInputStream ())); สายป้อนสตริง; System.out.println("เริ่มต้นการตอบสนองกระทืบ:"); ในขณะที่ ((inputLine = in.readLine()) != null) { System.out.println(สายเข้า); } in.close(); System.out.println("Crunchify Response Code:" + connection.getResponseCode()); } catch (ข้อยกเว้น e) { e.printStackTrace(); } } }
รหัสสร้างการใช้งาน TrustManager
แบบกำหนดเองที่เรียกว่า NullX509TrustManager
ซึ่งจะส่งคืนอาร์เรย์ที่ว่างเปล่าของผู้ออกที่ยอมรับ
เมธอด disableCertificateValidation
ตั้งค่าตัวจัดการความน่าเชื่อถือที่กำหนดเองนี้เป็นค่าดีฟอลต์สำหรับคลาส HttpsURLConnection
ผลลัพธ์คอนโซล IntelliJ IDEA:
เพียงเรียกใช้โปรแกรมด้านบนเป็น Java Application และคุณจะเห็นผลลัพธ์ด้านล่าง ฉันกำลังพิมพ์ใบรับรองสำหรับเว็บไซต์ https://crunchify.com
นี่คือใบรับรอง: [ [ รุ่น: V3 เรื่อง: CN=crunchify.com, O="Cloudflare, Inc.", L=ซานฟรานซิสโก, ST=แคลิฟอร์เนีย, C=สหรัฐฯ อัลกอริทึมลายเซ็น: SHA256withECDSA, OID = 1.2.840.10045.4.3.2 คีย์: คีย์สาธารณะ Sun EC, 256 บิต รหัสสาธารณะ x: 38529685942248262624712688939942529436235652555283274298255011250522606614918 รหัสสาธารณะ: 29334354097022760577193442773858953165938409689794173149697689580356278546401 พารามิเตอร์: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) อายุการใช้งาน: [ตั้งแต่: วันศุกร์ที่ 22 กรกฎาคม เวลา 19:00:00 น. CDT 2022, ถึง: อา. 23 ก.ค. 18:59:59 น. CDT 2023] ผู้ออก: 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 พ.ศ. ...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 พ.ศ. ..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 ....@...>...หน้า.. 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 ซีดี 6D 88 37 7C 6D . .P8.S ...ม.7.ม 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: URINชื่อ: http://ocsp.digicert.com , วิธีการเข้าถึง: caIssuers accessLocation: URIName: 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 ความสำคัญ = จริง ข้อจำกัดพื้นฐาน:[ คริส: เท็จ PathLen: ไม่ได้กำหนด ] [5]: ObjectId: 2.5.29.31 ความสำคัญ = เท็จ CRLDDistributionPoints [ [จุดกระจาย: [ชื่อ URL: http://crl3.digicert.com/CloudflareIncECCCA-3.crl] , จุดกระจายสินค้า: [ชื่อ URL: http://crl4.digicert.com/CloudflareIncECCCA-3.crl] ]] [6]: ObjectId: 2.5.29.32 ความสำคัญ = เท็จ ใบรับรองนโยบาย [ [CertificatePolicyId: [2.23.140.1.2.2] [PolicyQualifierInfo: [ qualifierID: 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 [ เซิร์ฟเวอร์Auth ลูกค้าตรวจสอบสิทธิ์ ] [8]: ObjectId: 2.5.29.15 ความสำคัญ = จริง การใช้งานคีย์ [ ลายเซ็นดิจิทัล ] [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 .... ] ] ] อัลกอริทึม: [SHA256with ECDSA] ลายเซ็น: 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 .....!......#.ย. 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 ม.....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 รหัสสาธารณะ: 84720202049003273739269829519636180374924996951868121119946393481023066512343 พารามิเตอร์: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) ความถูกต้อง: [จาก: วันจันทร์ที่ 27 มกราคม 06:48:08 CST 2020, ถึง: อ. 31 ธ.ค. 17:59:59 น. CST 2024] ผู้ออก: 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: URINชื่อ: 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 ความสำคัญ = จริง ข้อจำกัดพื้นฐาน:[ คริส:จริง เส้นทางเลน:0 ] [4]: ObjectId: 2.5.29.31 ความสำคัญ = เท็จ CRLDDistributionPoints [ [จุดกระจาย: [ชื่อ URL: http://crl3.digicert.com/Omniroot2025.crl] ]] [5]: ObjectId: 2.5.29.32 ความสำคัญ = เท็จ ใบรับรองนโยบาย [ [CertificatePolicyId: [2.16.840.1.114412.1.1] [PolicyQualifierInfo: [ qualifierID: 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 [ เซิร์ฟเวอร์Auth ลูกค้าตรวจสอบสิทธิ์ ] [7]: ObjectId: 2.5.29.15 ความสำคัญ = จริง การใช้งานคีย์ [ ลายเซ็นดิจิทัล 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 พ.ศ. 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 แต่โปรดทราบว่าควรใช้เพื่อวัตถุประสงค์ในการทดสอบเท่านั้น ไม่ใช่ในระบบที่ใช้งานจริง
แจ้งให้เราทราบหากคุณประสบปัญหาในการเรียกใช้รหัสนี้