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

Iphone 如何在Cocoa Touch中验证网站证书?,iphone,cocoa,https,certificate,verify,Iphone,Cocoa,Https,Certificate,Verify,我当前使用NSURLConnection打开了到web服务器的https连接。一切正常,我能够检索到我所关注的页面内容。证书是由VeriSign颁发的,我假设NSURLConnection在某种程度上做了一些工作来验证证书的真实性?如果我通过mobile safari连接到同一个网站,它将从证书中提取,并在导航栏中显示(网站的)组织。是否可能在Cocoa Touch中提取这些相同的细节,因为我也想将它们呈现给用户?另外,根据该证书验证服务器的主机名是否合理,足以假定该网站是合法的 NSURLCo

我当前使用NSURLConnection打开了到web服务器的https连接。一切正常,我能够检索到我所关注的页面内容。证书是由VeriSign颁发的,我假设NSURLConnection在某种程度上做了一些工作来验证证书的真实性?如果我通过mobile safari连接到同一个网站,它将从证书中提取,并在导航栏中显示(网站的)组织。是否可能在Cocoa Touch中提取这些相同的细节,因为我也想将它们呈现给用户?另外,根据该证书验证服务器的主机名是否合理,足以假定该网站是合法的

NSURLConnection
如果您试图使用无效证书(例如,该证书是自签名的、过期的、主机错误等)连接到服务器,则会出现错误(
NSURLErrorDomain
)。所以你实际上不需要自己做任何验证,因为这一切都是为你处理的

如果您确实希望/需要在UI中显示SSL证书摘要,则需要从
NSURLConnection
中下拉一层,并使用低级
CFNetwork
API。一旦您有一个处于
kcfstreamventendendecountered
状态的
CFReadStreamRef
,您应该能够执行以下操作(假设您的流句柄被称为
readStream
):


如果您想访问证书的各种属性,您需要解码
数据中保存的信息,但是
描述中保存的摘要可能就足够了。

感谢Nathan的帮助,按照您的建议删除一个层就成功了!虽然这不是一个真正的问题,但你的NSDictionary*cast不应该是NSArray*吗?
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]; 
}