كيفية تجاوز التحقق من شهادة SSL في جافا؟
نشرت: 2023-02-08طبقة مآخذ التوصيل الآمنة (SSL) وأمن طبقة النقل (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 ؛ / ** *author Crunchify.com * الإصدار: 2.1.1 * كيف يمكن تجاوز التحقق من شهادة SSL في جافا؟ * * / فئة عامة CrunchifyBypassSSLCert { العامة الثابتة الفراغ الرئيسي (سلسلة [] args) { crunchifyDisableCertificateValidation () ، crunchifyTestConnection ("https://crunchify.com") ؛ } فراغ ثابت عام crunchifyDisableCertificateValidation () { يحاول { // SSLContext: تمثل مثيلات هذه الفئة تطبيق بروتوكول مأخذ توصيل آمن // الذي يعمل كمصنع لمصانع المقابس الآمنة أو محركات SSLE. // تمت تهيئة هذه الفئة بمجموعة اختيارية من مديري المفاتيح والثقة ومصدر للبايت العشوائي الآمن. SSLContext crunchifySSLC = SSLContext.getInstance ("TLS") ، TrustManager [] trustManagerArray = {new NullX509TrustManager ()} ؛ crunchifySSLC.init (null، trustManagerArray، null) ؛ HttpsURLConnection.setDefaultSSLSocketFactory (crunchifySSLC.getSocketFactory ()) ، } catch (استثناء هـ) { e.printStackTrace () ؛ } } فئة ثابتة خاصة NullX509TrustManager تنفذ X509TrustManager { checkClientTrusted عام باطل (سلسلة X509Certificate [] ، String authType) { // لا تفعل شيئا } checkserverTrusted العامة (سلسلة X509Certificate [] ، String authType) { // لا تفعل شيئا } شهادة X509 العامة [] getAcceptedIssuers () { إعادة شهادة X509Certificate الجديدة [0] ؛ } } crunchifyTestConnection (String crunchifyURL) { يحاول { URL crunchifySiteURL = عنوان URL جديد (crunchifyURL) ؛ // HttpsURLConnection يوسع HttpURLConnection مع دعم ميزات خاصة بـ https. اتصال HttpsURLConnection = (HttpsURLConnection) crunchifySiteURL.openConnection () ، connect.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 Response Starts:")؛ بينما ((inputLine = in.readLine ())! = خالية) { System.out.println (خط الإدخال) ؛ } in.close () ؛ System.out.println ("Crunchify Response Code:" + connection.getResponseCode ())؛ } catch (استثناء هـ) { e.printStackTrace () ، } } }
يقوم الكود بإنشاء تطبيق TrustManager
المخصص يسمى NullX509TrustManager
والذي يقوم ببساطة بإرجاع مجموعة فارغة من المُصدرين المقبولين.
تعيّن طريقة disableCertificateValidation
إدارة الثقة المخصصة هذه على أنها الإعداد الافتراضي لفئة HttpsURLConnection
.
نتيجة وحدة التحكم IntelliJ IDEA:
ما عليك سوى تشغيل البرنامج أعلاه كتطبيق Java وسترى النتيجة على النحو التالي. أنا هنا أقوم بطباعة الشهادة للموقع https://crunchify.com
هذه الشهادة: [ [ الإصدار: V3.0 الموضوع: CN = crunchify.com، O = "Cloudflare، Inc."، L = San Francisco، ST = California، C = US خوارزمية التوقيع: SHA256 withECDSA ، 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]: معرف الكائن: 1.3.6.1.4.1.11129.2.4.2 الأهمية الحرجة = خطأ ملحق غير معروف: سلسلة OCTET بترميز 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 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 CD 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 3 ج 4 < [2]: معرف الهدف: 1.3.6.1.5.5.7.1.1 الأهمية الحرجة = خطأ AuthorityInfoAccess [ [ طريقة الوصول: ocsp الوصول الموقع: اسم URIN: http://ocsp.digicert.com و طريقة الوصول: المصدرون الوصول الموقع: URIName: http://cacerts.digicert.com/CloudflareIncECCCA-3.crt ] ] [3]: معرف الكائن: 2.5.29.35 الحرجة = خطأ معرّف مفتاح السلطة [ 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]: معرف الهدف: 2.5.29.19 الحرجة = صحيح القيود الأساسية: [ CA: خطأ PathLen: غير محدد ] [5]: معرف الكائن: 2.5.29.31 الحرجة = خطأ نقاط توزيع CRL [ [نقطة التوزيع: [URIName: http://crl3.digicert.com/CloudflareIncECCCA-3.crl] نقطة التوزيع: [URIName: http://crl4.digicert.com/CloudflareIncECCCA-3.crl] ]] [6]: معرف الكائن: 2.5.29.32 الأهمية الحرجة = خطأ سياسات الشهادات [ [CertificatePolicyId: [2.23.140.1.2.2] [PolicyQualifierInfo: [ معرف المؤهل: 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]: معرف الكائن: 2.5.29.37 الحرجة = خطأ ExtendedKeyUsages [ serverAuth العميل ] [8]: معرف الهدف: 2.5.29.15 الأهمية = صحيح KeyUsage [ توقيع إلكتروني ] [9]: معرف الهدف: 2.5.29.17 الأهمية الحرجة = خطأ SubjectAlternativeName [ اسم DNS: * .crunchify.com DNSName: crunchify.com ] [10]: معرف الكائن: 2.5.29.14 الحرجة = خطأ الموضوع KeyIdentifier [ 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 .... ] ] ] الخوارزمية: [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 .....! ...... #. 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.0 الموضوع: 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) الصلاحية: [من: Mon Jan 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]: معرف الهدف: 1.3.6.1.5.5.7.1.1 الأهمية الحرجة = خطأ AuthorityInfoAccess [ [ طريقة الوصول: ocsp الوصول الموقع: اسم URIN: http://ocsp.digicert.com ] ] [2]: معرف الكائن: 2.5.29.35 الحرجة = خطأ معرّف مفتاح السلطة [ KeyIdentifier [ 0000: E5 9D 59 30 82 47 58 CC FA 08 54 36 86 7B 3A ..Y0.GX .... T6 ..: 0010: B5 04 4D F0 .. م. ] ] [3]: معرف الهدف: 2.5.29.19 الحرجة = صحيح القيود الأساسية: [ كريس: صحيح باثلين: 0 ] [4]: معرف الكائن: 2.5.29.31 الحرجة = خطأ نقاط توزيع CRL [ [نقطة التوزيع: [URIName: http://crl3.digicert.com/Omniroot2025.crl] ]] [5]: معرف الكائن: 2.5.29.32 الأهمية الحرجة = خطأ سياسات الشهادات [ [CertificatePolicyId: [2.16.840.1.114412.1.1] [PolicyQualifierInfo: [ معرف المؤهل: 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]: معرف الكائن: 2.5.29.37 الحرجة = خطأ ExtendedKeyUsages [ serverAuth العميل ] [7]: معرف الهدف: 2.5.29.15 الأهمية = صحيح KeyUsage [ توقيع إلكتروني Key_CertSign Crl_Sign ] [8]: معرف الكائن: 2.5.29.14 الحرجة = خطأ الموضوع KeyIdentifier [ 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 .... ] ] ] الخوارزمية: [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.نحن..د 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 .... 8 HlP، I .. [د .. 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.: ...] .. مليون .. $. 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 ، ولكن ضع في اعتبارك أنه يجب استخدام هذا فقط لأغراض الاختبار وليس في أنظمة الإنتاج.
اسمحوا لي أن أعرف إذا كنت تواجه أي مشكلة في تشغيل هذا الرمز.