2009-08-09 28 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正确的你!我更新了示例代码。 –