我目前使用NSURLConnection打开https连接到Web服务器。一切都按照预期工作,我能够检索到所需的页面内容。证书由VeriSign颁发,我认为NSURLConnection会进行某些工作来在一定程度上验证证书的真实性?如果我通过移动Safari连接到同一网站,它将从证书中提取,并在导航栏中显示组织(网站的)。在Cocoa Touch中提取这些相同的详细信息是否可能呢?我也想向用户呈现它们。此外,验证服务器的主机名与该证书是否合理地假定网站是合法的?
我目前使用NSURLConnection打开https连接到Web服务器。一切都按照预期工作,我能够检索到所需的页面内容。证书由VeriSign颁发,我认为NSURLConnection会进行某些工作来在一定程度上验证证书的真实性?如果我通过移动Safari连接到同一网站,它将从证书中提取,并在导航栏中显示组织(网站的)。在Cocoa Touch中提取这些相同的详细信息是否可能呢?我也想向用户呈现它们。此外,验证服务器的主机名与该证书是否合理地假定网站是合法的?
NSURLConnection
会在您尝试连接到具有无效证书(例如,自签名、过期、错误的主机等)的服务器时给出错误(NSURLErrorDomain
)。因此,您实际上不需要进行任何验证,因为所有这些都已为您处理。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
中保存的摘要可能已经足够满足您的需求。