2008-08-18 59 views
8

使用NSURLRequest,我試圖訪問一個有過期證書的網站。當我發送請求,我連接:didFailWithError委託方法被調用,有下列信息:Objective-C/Cocoa:如何接受錯誤的服務器證書?

-1203, NSURLErrorDomain, bad server certificate 

我的搜索只打開了一個解決辦法:在的NSURLRequest一個隱藏的類方法:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost]; 

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

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

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

編輯:

iPhone OS 3.0中引入了這樣一個支持的方法。更多細節在這裏:How to use NSURLConnection to connect with SSL for an untrusted cert?

回答

1

我碰到了同樣的問題 - 我正在開發一個SOAP客戶端,並且開發服務器有一個「本土」證書。即使使用這種方法,我也無法解決這個問題,因爲我沒有使用NSURL,而是(文檔記錄不佳並且顯然已被廢棄)的WS方法,並決定暫時(內部)僅使用非SSL連接。

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

我還要舉Jens Alfke

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

+0

有問題的網站是在我們的測試環境中,只有訪問內部。我想網絡管理員太便宜或者懶得維護它的有效證書。當然,我們的生產環境擁有有效的證書。由於這種證書隱藏功能在生產中不會啓用或需要,我可以使用專用API來進行測試。我仍然希望以「正確」的方式來做,因爲如果私有API被抽出,我會回到原點。 – 2008-08-19 16:17:34

1

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

您還可能有興趣在這個崗位Re: How to handle bad certificate error in NSURLDownload

3

如果它是用於測試目的的內部服​​務器,爲什麼不直接導入測試服務器的證書到鑰匙鏈,並設置自定信任設置?

8

這樣做的支持方式需要使用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); 
0

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

我AsyncSocket一個巨大的風扇,它具有自簽名的證書

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

看看的支持,我認爲這是方式更強大的那麼標準NSURLRequests。

相關問題