Meine iPhone-Anwendung wurde nur für die Verwendung der (sehr sicheren, scheint es) privaten Methode +setAllowsAnyHTTPSCertificate:forHost:
für NSURLRequest
abgelehnt. Gibt es eine nicht-private API, um diese Funktionalität zu emulieren?Alternative Methode für NSURLRequest private "setAllowsAnyHTTPSCertificate: forHost:"?
Antwort
Es scheint eine öffentliche API für das zu sein;) How to use NSURLConnection to connect with SSL for an untrusted cert?
Vielen Dank! Seltsam, dass Google das nicht aufgedeckt hat. – Michael
Eine wirklich dumme Abhilfe ist, Ihre eigene Kategorie Methode zu machen:
@implementation NSURLRequest (IgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
Dieses von Apple private API überprüft bekommen sollte, aber es ist immer noch die gleiche Sache (mit einem privaten, nicht dokumentierte API [1], das ist jederzeit zu brechen). Eigentlich ist es schlimmer, da es alles erlaubt, nicht nur diesen Host.
[1]: Eine private API, die sollte veröffentlicht werden, aber eine private API dennoch.
Von dem, was ich davon weiß, wird dies die Prüfungen von Apple immer noch nicht bestehen, da sie scheinen, eine ziemlich einfache Analyse zu verwenden, die rein auf Selektoren basiert, nicht ihre Verwendung. –
@Mike: Bist du sicher? Ich benutze den Selektor überhaupt nicht, sondern definiere ihn nur neu. Es sind die Interna von Apple, die es nennen. Zugegeben, das ist überhaupt nicht sicher, aber ich sehe nicht, wie es Apples Schecks nicht passieren würde. – Michael
Auf diese Weise wird Ihre App definitiv abgelehnt. – Franklin
Werfen Sie einen Blick auf diesen Link: http://www.abstractec.co.uk/blog/iPhone.php?itemid=70
könnte für Sie eine bessere Lösung als nur die private API Check austricksen.
Ist es möglich, eine NSURLConnection statt einer CFHTTPMessageRef zu verwenden? Ich würde bevorzugen, dass der Download asynchron ist. – Michael
Keine Lösung, aber ein Vorschlag. Haben Sie darüber nachgedacht, ASIHttpRequest Framework dafür zu verwenden? Dieser Rahmen ist in allen Aspekten vollständig. Überprüfen Sie die Dokumentation, vielleicht kann es Ihnen auch helfen.
setAllowsAnyHTTPSCertificate scheint jetzt nicht unterstützte 10.6.6 ganz in OS X zu sein.
Habe ich 10.6.6 gesagt? Vielleicht hätte ich "Snow Vista" sagen sollen.
Eigentlich teste ich mit 10.6.8 und dieser Code funktioniert immer noch - es verwendet die private API, aber überprüft, dass der Selektor existiert (MyURL ist die NSURL Ich versuche, in ein WebView oder NSURLConnection zu laden) :
SEL selx = NSSelectorFromString(@"setAllowsAnyHTTPSCertificate:forHost:");
if ([NSURLRequest respondsToSelector: selx])
{
IMP fp;
fp = [NSURLRequest methodForSelector:selx];
(fp)([NSURLRequest class], selx, YES, [myurl host]);
}
Beachten Sie, dass „@selector“ nicht, so dass absolut alle verwendet wurde, die Arbeit zur Laufzeit durchgeführt werden würde. Das macht es ungefähr so sicher und so versteckt wie Apple's Checks, vor allem wenn man die Zeichenkette verdeckt.
Funktioniert gut! Danke – Chris
Keine empfohlene Lösung: (1) Sie geben Ihrem Benutzer nicht die Option zu akzeptieren oder nicht. (2) Du schreibst in einem öffentlichen Forum, wenn Apple darauf kommt, könnten sie weise werden. (3) Siehe Yonels Antwort: http://stackoverflow.com/a/2145367/818352 – George
Ich wollte nur sagen, dass dies für mich funktionierte, bis die 5S und die iPad Air herauskamen - stürzt hier (in der Besetzung) ab Geräte. – Luke
Warum möchten Sie in erster Linie ungültige HTTPs-Zertifikate zulassen? –
Hallo .. Ihr Problem ist gelöst, aber dafür haben Sie obige Methode in Ihrem Quellcode ausschließen? –