Frage

Benutzen NSURLRequest, Ich versuche, auf eine Website zuzugreifen, deren Zertifikat abgelaufen ist.Wenn ich die Anfrage sende, meine Verbindung:didFailWithError Die Delegate-Methode wird mit den folgenden Informationen aufgerufen:

-1203, NSURLErrorDomain, bad server certificate

Meine Suche hat nur eine Lösung ergeben:eine versteckte Klassenmethode in NSURLRequest:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

Aus offensichtlichen Gründen möchte ich jedoch keine privaten APIs in einer Produktions-App verwenden.

Irgendwelche Vorschläge, was zu tun ist?Muss ich CFNetwork-APIs verwenden und wenn ja, zwei Fragen:

  • Gibt es einen Beispielcode, den ich für den Anfang verwenden kann?Ich habe online keine gefunden.
  • Wenn ich dafür CFNetwork verwende, muss ich dann vollständig auf NSURL verzichten?

BEARBEITEN:

Mit iPhone OS 3.0 wurde hierfür eine unterstützte Methode eingeführt.Weitere Details hier: Wie verwende ich NSURLConnection, um eine Verbindung mit SSL für ein nicht vertrauenswürdiges Zertifikat herzustellen?

War es hilfreich?

Lösung 3

Mit iPhone OS 3.0 wurde hierfür eine unterstützte Methode eingeführt, für die keine CFNetwork-APIs auf niedrigerer Ebene erforderlich sind.Weitere Details hier:

Wie verwende ich NSURLConnection, um eine Verbindung mit SSL für ein nicht vertrauenswürdiges Zertifikat herzustellen?

Andere Tipps

Die unterstützte Vorgehensweise erfordert die Verwendung von CFNetwork.Sie müssen nur ein kCFStreamPropertySSLSettings an den Stream anhängen, das kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse angibt.Nachfolgend finden Sie einen kurzen Code, der dies erledigt, abzüglich der Prüfung auf gültige Ergebnisse und der Bereinigung.Sobald Sie dies getan haben, können Sie CFReadStreamRead() verwenden, um die Daten abzurufen.

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);

Wenn es sich um einen internen Server zu Testzwecken handelt, warum importieren Sie dann nicht einfach das Zertifikat des Testservers in den KeyChain und legen benutzerdefinierte Vertrauenseinstellungen fest?

Ich bin auf das gleiche Problem gestoßen: Ich habe einen SOAP-Client entwickelt und der Entwicklungsserver verfügt über ein „selbst erstelltes“ Zertifikat.Selbst mit dieser Methode konnte ich das Problem nicht lösen, da ich nicht NSURL, sondern die (schlecht dokumentierten und offenbar aufgegebenen) WS-Methoden verwendete und mich vorerst dafür entschied, (intern) einfach ein Nicht-SSL zu verwenden Verbindung.

Allerdings drängt sich mir die Frage auf: Wenn Sie nicht bereit sind, eine private API in einer Produktionsanwendung zu verwenden, sollten Sie dann den Zugriff auf eine Website mit einem fragwürdigen Zertifikat zulassen?

Ich werde zitieren Jens Alfke:

Das ist nicht nur ein theoretisches Sicherheitsproblem.Etwas
Demnach wurden etwa 25 % der öffentlichen DNS-Server kompromittiert
aktuelle Berichte und kann Benutzer sogar auf Phishing-/Malware-/Werbeseiten weiterleiten
wenn sie den Domainnamen richtig eingeben.Das Einzige, was dich beschützt
Daraus ergibt sich die SSL-Zertifikatsprüfung.

Können Sie ein selbstsigniertes Zertifikat erstellen und Ihre benutzerdefinierte Zertifizierungsstelle zu den vertrauenswürdigen Zertifizierungsstellen hinzufügen?Ich bin mir nicht ganz sicher, wie das auf dem iPhone funktionieren würde, aber ich gehe davon aus, dass Sie diese unter Mac OS X zum Schlüsselbund hinzufügen würden.

Dieser Beitrag könnte Sie auch interessieren Re:So behandeln Sie den Fehler „Ungültiges Zertifikat“ in NSURLDownload

Eine andere Möglichkeit wäre die Verwendung einer alternativen Verbindungsbibliothek.

Ich bin ein großer Fan von AsyncSocket und es unterstützt selbstsignierte Zertifikate

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

Schauen Sie mal, ich denke, es ist viel robuster als die Standard-NSURLRequests.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top