如何在Cocoa Touch中验证网站证书?

6

我目前使用NSURLConnection打开https连接到Web服务器。一切都按照预期工作,我能够检索到所需的页面内容。证书由VeriSign颁发,我认为NSURLConnection会进行某些工作来在一定程度上验证证书的真实性?如果我通过移动Safari连接到同一网站,它将从证书中提取,并在导航栏中显示组织(网站的)。在Cocoa Touch中提取这些相同的详细信息是否可能呢?我也想向用户呈现它们。此外,验证服务器的主机名与该证书是否合理地假定网站是合法的?

1个回答

5
NSURLConnection会在您尝试连接到具有无效证书(例如,自签名、过期、错误的主机等)的服务器时给出错误(NSURLErrorDomain)。因此,您实际上不需要进行任何验证,因为所有这些都已为您处理。
如果您确实想要/需要在UI中显示SSL证书摘要,您需要从NSURLConnection下降一个层,并改用低级别的CFNetwork API。一旦您拥有一个处于 kCFStreamEventEndEncountered 状态的CFReadStreamRef,您应该能够执行以下操作(假设您的流句柄称为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转换应该改成NSArray吧? - dbotha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接