Objective-C / Cocoa: Wie akzeptiere ich ein ungültiges Serverzertifikat?

8

Mit NSURLRequest versuche ich auf eine Website mit einem abgelaufenen Zertifikat zuzugreifen. Wenn ich die Anfrage sende, wird meine Delegiertenmethode connection: didFailWithError mit den folgenden Informationen aufgerufen:

%Vor%

Meine Suchen haben nur eine Lösung gefunden: eine versteckte Klassenmethode in NSURLRequest:

%Vor%

Ich möchte jedoch aus offensichtlichen Gründen 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:

  • Jeder Beispielcode, mit dem ich anfangen kann? Ich habe keine online gefunden.
  • Wenn ich CFNetwork dafür verwende, muss ich NSURL komplett streichen?

BEARBEITEN:

iPhone OS 3.0 hat eine unterstützte Methode eingeführt, um dies zu tun. Weitere Details finden Sie hier: Wie NSURLConnection zu verwenden Verbindung mit SSL für ein nicht vertrauenswürdiges Zertifikat herstellen?

    
Mike McMaster 18.08.2008, 21:40
quelle

6 Antworten

2

iPhone OS 3.0 hat eine unterstützte Methode eingeführt, die keine CFNetwork-APIs auf niedrigerer Ebene erfordert. Mehr Details hier:

Verwendung von NSURLConnection für Verbindung mit SSL für ein nicht vertrauenswürdiges Zertifikat herstellen?

    
Mike McMaster 03.02.2010, 21:05
quelle
8

Die unterstützte Vorgehensweise erfordert die Verwendung von CFNetwork. Sie müssen einen kCFStreamPropertySSLSettings an den Stream anhängen, der kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse angibt. Im Folgenden finden Sie einen kurzen Code, der dies tut. Abzüglich der Überprüfung auf gültige Ergebnisse wird die Bereinigung hinzugefügt. Sobald Sie dies getan haben, können Sie CFReadStreamRead () verwenden, um die Daten abzurufen.

%Vor%     
Louis Gerbarg 29.10.2008 05:37
quelle
3

Wenn es sich um einen internen Server für Testzwecke handelt, warum importieren Sie nicht einfach das Zertifikat des Testservers in den KeyChain und setzen Sie benutzerdefinierte Vertrauenseinstellungen?

    
user23743 18.10.2008 20:22
quelle
1

Ich habe das gleiche Problem - Ich habe einen SOAP-Client entwickelt, und der Dev-Server hat ein "homegrown" -Zertifikat. Ich konnte das Problem selbst mit dieser Methode nicht lösen, da ich nicht NSURL verwendete, sondern die (schlecht dokumentierten und scheinbar aufgegebenen) WS-Methoden, und entschied mich vorerst, (intern) nur eine Nicht-SSL zu verwenden Verbindung.

Nachdem Sie jedoch gesagt haben, dass Ihnen die Frage in den Sinn kommt, wenn Sie nicht bereit sind, eine private API in einer Produktions-App zu verwenden, sollten Sie den Zugriff auf eine Website mit einem zweifelhaften Zertifikat zulassen?

Ich zitiere Jens Alfke :

  

Das ist nicht nur ein theoretisches Sicherheitsproblem. Etwas   wie 25% der öffentlichen DNS-Server wurden kompromittiert   Aktuelle Berichte und können Benutzer sogar zu Phishing- / Malware- / Anzeigen-Websites leiten   wenn sie den Domainnamen richtig eingeben. Das einzige, was dich schützt   Von diesem ist die SSL-Zertifikatsüberprüfung.

    
Matthew Schinckel 19.08.2008 10:41
quelle
1

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

Sie könnten auch in diesem Beitrag interessiert sein Re: Wie mit einem schlechten Zertifikat Fehler umgehen in NSURLDownload

    
David Schlosnagle 21.08.2008 16:42
quelle
0

Eine andere Option wäre die Verwendung einer alternativen Verbindungsbibliothek.

Ich bin ein großer Fan von AsyncSocket und es hat Unterstützung für selbstsignierte Zertifikate

Ссылка

Schau mal, ich denke, es ist viel robuster als die Standard NSURLRequests.

    
chews 21.11.2008 19:06
quelle

Tags und Links