Obsługiwane jest obsługiwane API! Dodaj coś takiego do swojego NSURLConnection
delegata:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
if ([trustedHosts containsObject:challenge.protectionSpace.host])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
Pamiętaj, że connection:didReceiveAuthenticationChallenge:
może wysłać swoją wiadomość do challenge.sender (znacznie) później, po wyświetleniu użytkownikowi okna dialogowego, jeśli to konieczne itp.
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
Sposób powinien być używany.Jeśli nie chcesz (lub nie możesz) korzystać z prywatnych interfejsów API, istnieje biblioteka open source (licencja BSD) o nazwie ASIHTTPRequest, która zapewnia opakowanie wokół niższego poziomu
CFNetwork APIs
. Niedawno wprowadzono możliwość zezwalania naHTTPS connections
używanie certyfikatów z podpisem własnym lub niezaufanymi w-setValidatesSecureCertificate:
interfejsie API. Jeśli nie chcesz pobierać całej biblioteki, możesz użyć źródła jako odniesienia do samodzielnego wdrożenia tej samej funkcjonalności.źródło
W idealnym przypadku powinny istnieć tylko dwa scenariusze, w których aplikacja iOS musiałaby zaakceptować niezaufany certyfikat.
Scenariusz A: Masz połączenie ze środowiskiem testowym, które korzysta z certyfikatu z podpisem własnym.
Scenariusz B: Serwer proxy wykonuje
HTTPS
ruch przy użyciuMITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
serwera proxy Zwraca certyfikat podpisany przez samopodpisany urząd certyfikacji, aby serwer proxy mógł przechwytywaćHTTPS
ruch.Hosty produkcyjne nigdy nie powinny używać niezaufanych certyfikatów z oczywistych powodów .
Jeśli potrzebujesz, aby symulator iOS zaakceptował niezaufany certyfikat do celów testowych, zdecydowanie nie należy zmieniać logiki aplikacji, aby wyłączyć wbudowane sprawdzanie poprawności certyfikatu zapewniane przez
NSURLConnection
interfejsy API. Jeśli aplikacja zostanie udostępniona publicznie bez usunięcia tej logiki, będzie podatna na ataki typu man-in-the-middle.Zalecanym sposobem akceptowania niezaufanych certyfikatów do celów testowych jest zaimportowanie certyfikatu urzędu certyfikacji (CA), który podpisał certyfikat na symulatorze lub urządzeniu z systemem iOS. Napisałem szybki post na blogu, który pokazuje, jak to zrobić, na którym znajduje się symulator iOS:
akceptowanie niezaufanych certyfikatów za pomocą symulatora ios
źródło
NSURLRequest
ma prywatną metodę o nazwiesetAllowsAnyHTTPSCertificate:forHost:
, która zrobi dokładnie to, co chcesz. Możesz zdefiniowaćallowsAnyHTTPSCertificateForHost:
metodęNSURLRequest
za pomocą kategorii i ustawić ją tak, aby zwracała sięYES
po hoście, który chcesz zastąpić.źródło
W celu uzupełnienia przyjętej odpowiedzi, dla znacznie większego bezpieczeństwa, możesz dodać swój certyfikat serwera lub własny certyfikat głównego urzędu certyfikacji do pęku kluczy ( https://stackoverflow.com/a/9941559/1432048 ), ale zrobienie tego samemu nie spowoduje NSURLConnection automatycznie uwierzytelnij samopodpisany serwer. Nadal musisz dodać poniższy kod do delegata NSURLConnection, jest on kopiowany z przykładowego kodu Apple AdvancedURLConnections i musisz dodać dwa pliki (Credentials.h, Credentials.m) z przykładowego kodu Apple do swoich projektów.
źródło
Nie mogę tego przypisać, ale ten, który okazał się bardzo skuteczny dla moich potrzeb.
shouldAllowSelfSignedCert
jest mojąBOOL
zmienną. Po prostu dodaj do swojegoNSURLConnection
delegata i powinieneś się rozerwać, aby szybko ominąć połączenie dla każdego połączenia.źródło
W iOS 9 połączenia SSL nie będą działać dla wszystkich nieprawidłowych lub samopodpisanych certyfikatów. Jest to domyślne zachowanie nowej funkcji App Transport Security w systemie iOS 9.0 lub nowszym oraz w OS X 10.11 i nowszych.
Możesz zastąpić to zachowanie w
Info.plist
, ustawiającNSAllowsArbitraryLoads
naYES
wNSAppTransportSecurity
słowniku. Zalecam jednak zastąpienie tego ustawienia wyłącznie do celów testowych.Aby uzyskać więcej informacji, zobacz Technote aplikacji transportu tutaj .
źródło
Obejście kategorii opublikowane przez Nathana de Vriesa przejdzie testy prywatnego interfejsu API AppStore i jest przydatne w przypadkach, gdy nie masz kontroli nad
NSUrlConnection
obiektem. Jednym z przykładów jestNSXMLParser
otwarcie podanego adresu URL, ale nie ujawnienieNSURLRequest
lubNSURLConnection
.W iOS 4 obejście nadal wydaje się działać, ale tylko na urządzeniu Symulator nie wywołuje
allowsAnyHTTPSCertificateForHost:
już tej metody.źródło
Musisz użyć,
NSURLConnectionDelegate
aby zezwolić na połączenia HTTPS, aw iOS8 pojawiły się nowe połączenia zwrotne.Przestarzałe:
Zamiast tego musisz zadeklarować:
Dzięki
willSendRequestForAuthenticationChallenge
możesz używaćchallenge
tak jak w przypadku przestarzałych metod, na przykład:źródło
Zamieściłem trochę kodu gist (na podstawie pracy innej osoby, którą odnotowuję), która pozwala poprawnie uwierzytelnić się na podstawie samodzielnie wygenerowanego certyfikatu (i jak uzyskać bezpłatny certyfikat - patrz komentarze na dole Cocoanetics )
Mój kod jest tutaj github
źródło
Jeśli chcesz nadal używać sendSynchronousRequest, pracuję w tym rozwiązaniu:
możesz to zobaczyć tutaj: Synchroniczne połączenie SSL celu-C
źródło
Dzięki AFNetworking z powodzeniem korzystałem z usługi https z poniższym kodem,
źródło
Możesz użyć tego kodu
Posługiwać się
-connection:willSendRequestForAuthenticationChallenge:
zamiast tych przestarzałych metodPrzestarzałe:
źródło