Vra

Die gebruik van NSURLRequest , ek probeer om toegang tot 'n webwerf wat 'n verval sertifikaat het. Toe ek stuur die versoek, my verbinding: didFailWithError afgevaardigde metode is opgeroep met die volgende inligting:

-1203, NSURLErrorDomain, bad server certificate

My soektogte het net opgedaag het een oplossing: 'n versteekte klas metode in NSURLRequest:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

Maar ek wil nie private APIs gebruik in 'n produksie app vir ooglopende redes.

Enige voorstelle oor wat om te doen? Moet ek CFNetwork APIs gebruik, en indien wel, twee vrae:

  • 'n Monster-kode wat ek kan gebruik om te begin? Ek het nie gevind nie enige online.
  • As ek CFNetwork gebruik vir hierdie, moet ek NSURL heeltemal sloot?

EDIT:

iPhone OS 3.0 het 'n gesteun metode om dit te doen. Meer besonderhede hier: Hoe om NSURLConnection gebruik om met SSL vir 'n nie-vertrou sert?

Was dit nuttig?

Oplossing 3

iPhone OS 3.0 het 'n gesteun manier om dit te doen wat nie die laer-vlak CFNetwork APIs vereis. Meer besonderhede hier:

Hoe om NSURLConnection gebruik om verbind met SSL vir 'n nie-vertrou sert?

Ander wenke

Die ondersteun manier om dit te doen vereis die gebruik van CFNetwork. Jy hoef te doen is heg 'n kCFStreamPropertySSLSettings om die stroom wat spesifiseer kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse. Hier is 'n paar vinnige kode wat dit doen, minus die nagaan vir geldige resultate voeg skoonmaak. Sodra jy dit gedoen het Jy kan CFReadStreamRead () gebruik om die data te kry.

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

As dit vir 'n interne bediener vir toetsdoeleindes, waarom nie net sertifikaat die toets bediener se invoer in die sleutelhanger en stel persoonlike vertroue instellings?

Ek het dieselfde probleem getref - Ek is besig om 'n SOAP kliënt, en die dev bediener het 'n "tuisgekweekte" sertifikaat. Ek was nie in staat om die probleem op te los, selfs met behulp van hierdie metode, want ek is nie die gebruik van NSURL, maar die (swak gedokumenteer en blykbaar verlate) WS metodes, en besluit voorlopig tot (intern) net 'n nie-SSL gebruik verbinding.

Noudat dit gesê is, maar die vraag wat spruit na vore is, as jy nie bereid is om 'n private API te gebruik in 'n produksie app, moet jy toegang tot 'n webwerf met 'n dodgy sertifikaat word sodat?

Ek sal quote Jens Alfke :

  

Dit is nie net 'n teoretiese sekuriteit probleem. iets
  soos 25% van openbare DNS-bedieners in gevaar gestel, volgens
  onlangse berigte, en kan gebruikers verwys na phishing / malware / ad webwerwe selfs
  as hulle die naam domein behoorlik. Die enigste ding wat die beskerming van jou
  uit wat SSL sertifikaat nagaan.

Kan jy 'n self ondertekende sertifikaat te skep en voeg jou persoonlike sertifikaat gesag aan die betroubare GR'e? Ek is nie heeltemal seker hoe dit sou werk op die iPhone, maar ek wil aanneem op Mac OS X sou jy hierdie voeg tot die Sleutelhanger.

Hoe:

Jy kan ook belangstel in hierdie pos Re wees slegte sertifikaat fout hanteer in NSURLDownload

Nog 'n opsie sou wees om 'n alternatiewe verband biblioteek gebruik.

Ek is 'n groot fan van AsyncSocket en dit het ondersteuning vir self onderteken certs

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

Neem 'n blik, ek dink dit is manier om meer robuuste dan die standaard NSURLRequests.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top