الهدف-C/الكاكاو:كيف يمكنني قبول شهادة خادم سيئة؟

StackOverflow https://stackoverflow.com/questions/15266

  •  08-06-2019
  •  | 
  •  

سؤال

استخدام NSURLRequest, ، أحاول الوصول إلى موقع ويب يحتوي على شهادة منتهية الصلاحية.عندما أرسل الطلب، بلدي الاتصال: didFailWithError يتم استدعاء طريقة التفويض بالمعلومات التالية:

-1203, NSURLErrorDomain, bad server certificate

لقد أظهرت عمليات البحث التي أجريتها حلاً واحدًا فقط:طريقة فئة مخفية في NSURLRequest:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

ومع ذلك، لا أرغب في استخدام واجهات برمجة التطبيقات الخاصة في تطبيق الإنتاج لأسباب واضحة.

أي اقتراحات بشأن ما يجب القيام به؟هل أحتاج إلى استخدام واجهات برمجة تطبيقات CFNetwork، وإذا كان الأمر كذلك، سؤالين:

  • هل هناك أي نموذج للتعليمات البرمجية يمكنني استخدامه للبدء؟لم أجد أي على الانترنت.
  • إذا استخدمت CFNetwork لهذا الغرض، فهل يجب علي التخلص من NSURL بالكامل؟

يحرر:

قدم iPhone OS 3.0 طريقة مدعومة للقيام بذلك.مزيد من التفاصيل هنا: كيفية استخدام NSURLConnection للاتصال بـ SSL للحصول على شهادة غير موثوقة؟

هل كانت مفيدة؟

المحلول 3

قدم iPhone OS 3.0 طريقة مدعومة للقيام بذلك لا تتطلب واجهات برمجة تطبيقات CFNetwork ذات المستوى الأدنى.مزيد من التفاصيل هنا:

كيفية استخدام NSURLConnection للاتصال بـ SSL للحصول على شهادة غير موثوقة؟

نصائح أخرى

تتطلب الطريقة المدعومة للقيام بذلك استخدام CFNetwork.ما عليك فعله هو إرفاق kCFStreamPropertySSLSettings بالدفق الذي يحدد kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse.فيما يلي بعض التعليمات البرمجية السريعة التي تقوم بذلك، بالإضافة إلى التحقق من النتائج الصالحة وإضافة التنظيف.بمجرد الانتهاء من ذلك، يمكنك استخدام CFReadStreamRead() للحصول على البيانات.

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL);
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1);
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);    
CFReadStreamOpen(myStream);

إذا كان الأمر يتعلق بخادم داخلي لأغراض الاختبار، فلماذا لا نقوم فقط باستيراد شهادة خادم الاختبار إلى KeyChain وتعيين إعدادات الثقة المخصصة؟

لقد واجهت نفس المشكلة - كنت أقوم بتطوير عميل SOAP، وكان خادم التطوير لديه شهادة "محلية".لم أتمكن من حل المشكلة حتى باستخدام هذه الطريقة، نظرًا لأنني لم أكن أستخدم NSURL، ولكن أساليب WS (سيئة التوثيق والمهجورة على ما يبدو)، وقررت في الوقت الحالي استخدام (داخليًا) فقط غير SSL اتصال.

ومع ذلك، فإن السؤال الذي يتبادر إلى ذهنك هو، إذا لم تكن على استعداد لاستخدام واجهة برمجة تطبيقات خاصة في تطبيق إنتاج، فهل يجب أن تسمح بالوصول إلى موقع باستخدام شهادة مراوغة؟

سأقتبس ينس الفكي:

هذه ليست مجرد مشكلة أمنية نظرية.شئ ما
وفقًا لـ 25% من خوادم DNS العامة قد تم اختراقها
التقارير الأخيرة، ويمكنه توجيه المستخدمين إلى مواقع التصيد الاحتيالي/البرامج الضارة/الإعلانات
إذا أدخلوا اسم المجال بشكل صحيح.الشيء الوحيد الذي يحميك
ومن ذلك التحقق من شهادة SSL.

هل يمكنك إنشاء شهادة موقعة ذاتيًا وإضافة المرجع المصدق المخصص الخاص بك إلى المراجع المصدقة الموثوقة؟لست متأكدًا تمامًا من كيفية عمل ذلك على iPhone، لكنني أفترض أنه في نظام التشغيل Mac OS X، ستضيف هذه العناصر إلى Keychain.

قد تكون مهتمًا أيضًا بهذا المنشور يكرر:كيفية التعامل مع خطأ الشهادة السيئة في NSURLDownload

هناك خيار آخر يتمثل في استخدام مكتبة اتصال بديلة.

أنا من أشد المعجبين بـ AsyncSocket وهو يدعم الشهادات الموقعة ذاتيًا

http://code.google.com/p/cocoaasyncsocket/

ألقِ نظرة، أعتقد أنها أقوى بكثير من طلبات NSURLRequests القياسية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top