Ich habe den folgenden einfachen Code, um eine Verbindung zu einer SSL-Webseite herzustellen
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
Außer es gibt einen Fehler, wenn das Zertifikat selbstsigniert ist. Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
Gibt es eine Möglichkeit, es so einzustellen, dass Verbindungen trotzdem akzeptiert werden (genau wie in einem Browser, in dem Sie auf Akzeptieren klicken können) oder es zu umgehen?
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
Methode sollte stattdessen verwendet werden.Wenn Sie nicht bereit (oder nicht in der Lage) sind, private APIs zu verwenden, gibt es eine Open-Source-Bibliothek (BSD-Lizenz) namens ASIHTTPRequest , die einen Wrapper für die untere Ebene bereitstellt
CFNetwork APIs
. Sie haben kürzlich die Möglichkeit eingeführt, dieHTTPS connections
Verwendung von selbstsignierten oder nicht vertrauenswürdigen Zertifikaten mit der-setValidatesSecureCertificate:
API zuzulassen . Wenn Sie nicht die gesamte Bibliothek abrufen möchten, können Sie die Quelle als Referenz verwenden, um dieselbe Funktionalität selbst zu implementieren.quelle
Im Idealfall sollte es nur zwei Szenarien geben, in denen eine iOS-Anwendung ein nicht vertrauenswürdiges Zertifikat akzeptieren muss.
Szenario A: Sie sind mit einer Testumgebung verbunden, die ein selbstsigniertes Zertifikat verwendet.
Szenario B: Sie stellen
HTTPS
Datenverkehr mithilfe einesMITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
Proxys bereit. Die Proxies geben ein von einer selbstsignierten Zertifizierungsstelle signiertes Zertifikat zurück, damit der ProxyHTTPS
Datenverkehr erfassen kann .Produktionshosts sollten aus offensichtlichen Gründen niemals nicht vertrauenswürdige Zertifikate verwenden .
Wenn der iOS-Simulator zu Testzwecken ein nicht vertrauenswürdiges Zertifikat akzeptieren muss, wird dringend empfohlen, die Anwendungslogik nicht zu ändern, um die von den
NSURLConnection
APIs bereitgestellte integrierte Zertifikatvalidierung zu deaktivieren . Wenn die Anwendung für die Öffentlichkeit freigegeben wird, ohne diese Logik zu entfernen, ist sie anfällig für Man-in-the-Middle-Angriffe.Die empfohlene Methode zum Akzeptieren nicht vertrauenswürdiger Zertifikate zu Testzwecken besteht darin, das Zertifikat der Zertifizierungsstelle (Certificate Authority, CA), das das Zertifikat signiert hat, auf Ihren iOS-Simulator oder Ihr iOS-Gerät zu importieren. Ich habe einen kurzen Blog-Beitrag geschrieben, der zeigt, wie man das mit einem iOS-Simulator macht:
Akzeptieren nicht vertrauenswürdiger Zertifikate mit dem iOS-Simulator
quelle
NSURLRequest
hat eine private Methode namenssetAllowsAnyHTTPSCertificate:forHost:
, die genau das tut, was Sie möchten. Sie können dieallowsAnyHTTPSCertificateForHost:
MethodeNSURLRequest
über eine Kategorie definieren und festlegen, dass sieYES
für den Host zurückgegeben wird, den Sie überschreiben möchten.quelle
Um die akzeptierte Antwort zu ergänzen, können Sie aus Sicherheitsgründen Ihr Serverzertifikat oder Ihr eigenes Zertifikat der Stammzertifizierungsstelle zum Schlüsselbund hinzufügen ( https://stackoverflow.com/a/9941559/1432048 ). Dies allein führt jedoch nicht zu einer NSURLConnection Authentifizieren Sie Ihren selbstsignierten Server automatisch. Sie müssen Ihrem NSURLConnection-Delegaten weiterhin den folgenden Code hinzufügen, der aus dem Apple-Beispielcode AdvancedURLConnections kopiert wurde , und Sie müssen Ihren Projekten zwei Dateien (Credentials.h, Credentials.m) aus dem Apple-Beispielcode hinzufügen.
quelle
Ich kann das nicht gutschreiben, aber dieses, das ich gefunden habe, hat wirklich gut für meine Bedürfnisse funktioniert.
shouldAllowSelfSignedCert
ist meineBOOL
Variable. Fügen Sie einfach IhremNSURLConnection
Delegierten hinzu, und Sie sollten sich auf eine schnelle Umgehung pro Verbindung einstellen.quelle
In iOS 9 schlagen SSL-Verbindungen für alle ungültigen oder selbstsignierten Zertifikate fehl. Dies ist das Standardverhalten der neuen App Transport Security- Funktion in iOS 9.0 oder höher und unter OS X 10.11 und höher.
Sie können dieses Verhalten im Wörterbuch überschreiben
Info.plist
, indem SieNSAllowsArbitraryLoads
esYES
imNSAppTransportSecurity
Wörterbuch auf setzen. Ich empfehle jedoch, diese Einstellung nur zu Testzwecken zu überschreiben.Informationen finden Sie unter App Transport Technote hier .
quelle
Die von Nathan de Vries veröffentlichte Problemumgehung für Kategorien besteht die privaten API-Prüfungen des AppStore und ist in Fällen hilfreich, in denen Sie keine Kontrolle über das
NSUrlConnection
Objekt haben. Ein Beispiel istNSXMLParser
das Öffnen der von Ihnen angegebenen URL, ohne dasNSURLRequest
oderNSURLConnection
.In iOS 4 scheint die Problemumgehung immer noch zu funktionieren, aber nur auf dem Gerät ruft der Simulator die
allowsAnyHTTPSCertificateForHost:
Methode nicht mehr auf.quelle
Du musst benutzen
NSURLConnectionDelegate
, um HTTPS-Verbindungen zuzulassen, und es gibt neue Rückrufe mit iOS8.Veraltet:
Stattdessen müssen Sie Folgendes deklarieren:
Mit
willSendRequestForAuthenticationChallenge
könnenchallenge
Sie wie mit den veralteten Methoden verwenden, zum Beispiel:quelle
Ich habe einen Kerncode veröffentlicht (basierend auf der Arbeit eines anderen, den ich notiere), mit dem Sie sich ordnungsgemäß bei einem selbst erstellten Zertifikat authentifizieren können (und wie Sie ein kostenloses Zertifikat erhalten - siehe Kommentare unten in Cocoanetics ).
Mein Code ist hier Github
quelle
Wenn Sie sendSynchronousRequest weiterhin verwenden möchten, arbeite ich in dieser Lösung:
Sie können es hier sehen: Objective-C SSL Synchronous Connection
quelle
Mit AFNetworking habe ich den https-Webservice mit dem folgenden Code erfolgreich genutzt.
quelle
Sie können diesen Code verwenden
Verwenden Sie
-connection:willSendRequestForAuthenticationChallenge:
anstelle dieser veralteten MethodenVeraltet:
quelle