2009-08-09 60 views
6

我目前使用NSURLConnection打開一個到Web服務器的https連接。一切都按原樣運行,我可以檢索我之後的頁面內容。證書由VeriSign頒發,我假定NSURLConnection在某種程度上做了一些工作來驗證證書的真實性。如果我通過移動Safari瀏覽器連接到同一網站,它將從證書中提取,並在導航欄中顯示組織(網站的)。是否可能在Cocoa Touch中提取這些相同的細節,因爲我也想將它們呈現給用戶?還要根據該證書驗證服務器的主機名是否足夠合理以承擔網站的合法性?如何驗證Cocoa Touch中的網站證書?

回答

5

NSURLConnection如果您嘗試連接到具有無效證書的服務器(例如,它是自簽名的,過期的,具有錯誤的主機等),則會出現錯誤(NSURLErrorDomain)。所以你實際上不需要自己做任何驗證,因爲它都是爲你處理的。

如果您確實需要/需要在您的用戶界面中顯示SSL證書摘要,則需要從NSURLConnection下拉一層,並使用低級別CFNetworkAPI。一旦你有一個CFReadStreamRef這是在kCFStreamEventEndEncountered狀態,你應該能夠做到以下幾點(假設你的流手柄稱爲readStream):

NSArray* certificates = [(NSArray*)CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) autorelease]; 
if ([certificates count] > 0) { 
    SecCertificateRef certificate = (SecCertificateRef)[certificates objectAtIndex:0]; 
    NSString* description = [(NSString*)SecCertificateCopySubjectSummary(certificate) autorelease]; 
    NSData* data = [(NSData*)SecCertificateCopyData(certificate) autorelease]; 
} 

你需要,如果你想在data舉行的信息進行解碼訪問證書的各種屬性,但在description舉行的總結可能已足夠您的目的。

+1

感謝Nathan的幫助,放下了一層像你這樣的竅門!雖然不是一個真正的問題,你的NSDictionary * cast不應該是NSArray *嗎? – dbotha

+0

你能發佈代碼示例Deon嗎? – Pripyat

+0

@Deon正確的你!我更新了示例代碼。 –