objective-c - conn - ios app testing




Objective-C/Cocoa:如何接受錯誤的服務器證書? (4)

使用NSURLRequest ,我試圖訪問一個有過期證書的網站。 當我發送請求,我的連接:didFailWithError委託方法調用與以下信息:

-1203, NSURLErrorDomain, bad server certificate

我的搜索只有一個解決方案:NSURLRequest中的隱藏類方法:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

但是,我不想在生產應用程序中使用私有API,原因很明顯。

有什麼建議做什麼? 我是否需要使用CFNetwork API,如果有的話,有兩個問題:

  • 我可以使用任何示例代碼開始? 我還沒有找到任何在線。
  • 如果我為此使用CFNetwork,是否必須完全消除NSURL?

編輯:

iPhone OS 3.0引入了一個支持的方法來做到這一點。 更多細節在這裡: 如何使用NSURLConnection與SSL連接不受信任的證書?


我遇到了同樣的問題 - 我正在開發一個SOAP客戶端,並且開發服務器有一個“本地”證書。 我甚至不能使用這種方法來解決這個問題,因為我沒有使用NSURL,而是(文檔記錄不佳,顯然是被遺棄的)WS方法,並決定暫時(內部)只使用一個非SSL連接。

話雖如此,但要想到的問題是,如果您不願意在生產應用程序中使用私有API,您是否允許訪問帶有狡詐證書的網站?

我會引用Jens Alfke的話

這不僅僅是一個理論上的安全問題。 某物
據25%的公共DNS服務器已經被入侵
最近的報導,甚至可以引導用戶釣魚/惡意軟件/廣告網站
如果他們正確輸入域名。 唯一保護你的東西
從那是SSL證書檢查。


您可以創建一個自簽名證書,並將您的自定義證書頒發機構添加到受信任的CA? 我不太確定這是如何在iPhone上工作的,但我假設在Mac OS X上,您將把這些添加到鑰匙串。

您可能也對這篇文章感興趣Re:如何處理NSURLDownload下的錯誤證書錯誤


支持的方式需要使用CFNetwork。 您必須做的是將kCFStreamPropertySSLSettings附加到指定kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse的流。 下面是一些快速代碼,減去檢查有效結果添加清理。 完成此操作後,可以使用CFReadStreamRead()獲取數據。

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

另一個選擇是使用備用連接庫。

我是AsyncSocket的粉絲,它支持自簽名的證書

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

看看,我認為這是比標準NSURLRequests更強大的方式。





networking