// Now start the connectionNSURL*httpsURL=[NSURLURLWithString:@"https://www.google.com"];self.connection=[NSURLConnectionconnectionWithRequest:[NSURLRequestrequestWithURL:httpsURL]delegate:self];//回调-(void)connection:(NSURLConnection*)connectionwillSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge{//1)获取trust objectSecTrustReftrust=challenge.protectionSpace.serverTrust;SecTrustResultTyperesult;//2)SecTrustEvaluate对trust进行验证OSStatusstatus=SecTrustEvaluate(trust,&result);if(status==errSecSuccess&&(result==kSecTrustResultProceed||result==kSecTrustResultUnspecified)){//3)验证成功,生成NSURLCredential凭证cred,告知challenge的sender使用这个凭证来继续连接NSURLCredential*cred=[NSURLCredentialcredentialForTrust:trust];[challenge.senderuseCredential:credforAuthenticationChallenge:challenge];}else{//5)验证失败,取消这次验证流程[challenge.sendercancelAuthenticationChallenge:challenge];}}
//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO//如果是需要验证自建证书,需要设置为YESsecurityPolicy.allowInvalidCertificates=YES;//validatesDomainName 是否需要验证域名,默认为YES;//假如证书的域名与你请求的域名不一致,需把该项设置为NO//主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。securityPolicy.validatesDomainName=NO;//validatesCertificateChain 是否验证整个证书链,默认为YES//设置为YES,会将服务器返回的Trust Object上的证书链与本地导入的证书进行对比,这就意味着,假如你的证书链是这样的://GeoTrust Global CA // Google Internet Authority G2// *.google.com//那么,除了导入*.google.com之外,还需要导入证书链上所有的CA证书(GeoTrust Global CA, Google Internet Authority G2);//如是自建证书的时候,可以设置为YES,增强安全性;假如是信任的CA所签发的证书,则建议关闭该验证;securityPolicy.validatesCertificateChain=NO;