سؤال

أقوم حاليا بفتح اتصال HTTPS بخادم ويب باستخدام NSurLConnection. كل شيء يعمل كما يجب أن يسترجع محتوى الصفحة أنا بعد. تصدر الشهادة عن طريق VeriSign وأنا أفترض أن NsurlConnection هل بعض العمل للتحقق من صحة الشهادة إلى حد ما؟ إذا قمت بالتواصل مع نفس الموقع من خلال Safari المحمول، فسيتم استخراجه من الشهادة، وعرض المنظمة (من الموقع الإلكتروني) في شريط التنقل. هل من المحتمل استخراج هذه التفاصيل نفسها في اتصال الكاكاو كما أود أن أقدمها للمستخدم؟ كما سيحقق اسم مضيف الخادم ضد تلك الشهادة معقولة بما يكفي لتحمل موقع الويب هو شرعي؟

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

المحلول

NSURLConnection سوف تعطيك خطأ (NSURLErrorDomain) إذا حاولت الاتصال بالخادم بشهادة غير صالحة (على سبيل المثال، فقد تم توقيعها على نفسه، فقد يكون هناك مضيف خاطئ وما إلى ذلك). لذلك أنت لا تحتاج فعليا إلى القيام بأي تحقق بنفسك، لأن كل شيء يتعامل معك.

إذا كنت تريد حقا / تحتاج إلى عرض ملخص شهادة SSL في UI، فستحتاج إلى إسقاط طبقة من NSURLConnection واستخدام مستوى منخفض CFNetwork API بدلا من ذلك. بمجرد أن يكون لديك CFReadStreamRef هذا في kCFStreamEventEndEncountered الحالة، يجب أن تكون قادرا على القيام بما يلي (لتحمل مقبض دفق الخاص بك يسمى readStream):

NSArray* certificates = [(NSArray*)CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) autorelease]; 
if ([certificates count] > 0) { 
  SecCertificateRef certificate = (SecCertificateRef)[certificates objectAtIndex:0]; 
  NSString* description = [(NSString*)SecCertificateCopySubjectSummary(certificate) autorelease]; 
  NSData* data = [(NSData*)SecCertificateCopyData(certificate) autorelease]; 
}

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

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