2009-08-09 10 views
6

Aktualnie otwieram połączenie https z serwerem WWW przy użyciu NSURLConnection. Wszystko działa tak, jak powinno i mogę odzyskać zawartość strony, której szukam. Certyfikat jest wydawany przez VeriSign i zakładam, że NSURLConnection w pewnym stopniu wymaga weryfikacji autentyczności certyfikatu? Jeśli połączyłem się z tą samą witryną przez mobilne safari, wyodrębniłbym ją z certyfikatu i wyświetliłaby organizację (strony) na pasku nawigacyjnym. Czy możliwe jest wyodrębnienie tych samych szczegółów w Cocoa Touch, ponieważ ja również chciałbym je przedstawić użytkownikowi? Czy weryfikacja nazwy hosta serwera względem tego certyfikatu byłaby na tyle rozsądna, aby zakładać, że strona internetowa jest prawidłowa?Jak zweryfikować certyfikat witryny w Cocoa Touch?

Odpowiedz

5

da błąd (NSURLErrorDomain), jeśli spróbujesz połączyć się z serwerem za pomocą nieważnego certyfikatu (np. Więc nie musisz sam przeprowadzać żadnej weryfikacji, ponieważ wszystko jest dla ciebie obsługiwane.

Jeśli naprawdę chcesz/chcesz wyświetlić podsumowanie certyfikatu SSL w interfejsie użytkownika, musisz usunąć warstwę z NSURLConnection i zamiast tego użyć interfejsu API niskiego poziomu CFNetwork. Raz masz CFReadStreamRef, który jest w stanie kCFStreamEventEndEncountered, powinieneś być w stanie wykonać następujące czynności (zakładając, że uchwyt strumień nazywa 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]; 
} 

Musisz dekodowania informacji przechowywanych w data jeśli chcesz aby uzyskać dostęp do różnych właściwości certyfikatu, ale podsumowanie w numerze description może wystarczyć dla twoich celów.

+1

Dzięki za pomoc Nathan, upuszczenie warstwy podobnej do tej, którą zasugerowałeś, rozwiązało problem! Chociaż nie jest to prawdziwy problem, czy Twój NSDictionary * nie powinien być zamiast NSArray *? – dbotha

+0

Czy byłbyś w stanie wysłać próbkę kodu Deon? – Pripyat

+0

@Deon Dobrze, jesteś! Zaktualizowałem przykładowy kod. –

Powiązane problemy