現象:
iOS客戶端接口請求,由http改為https后AFN總提示:Error Domain=NSURLErrorDomain Code=-999 "cancelled"
解決方案:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// https ssl 驗證。
[manager setSecurityPolicy:[self customSecurityPolicy]];
// https ssl 驗證函數 + (AFSecurityPolicy *)customSecurityPolicy {
// 先導入證書 證書由服務端生成,具體由服務端人員操作
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"client" ofType:@"cer"];//證書的路徑
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用證書驗證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO
// 如果是需要驗證自建證書,需要設置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗證域名,默認為YES;
//假如證書的域名與你請求的域名不一致,需把該項設置為NO;如設成NO的話,即服務器使用其他可信任機構頒發的證書,也可以建立連接,這個非常危險,建議打開。
//置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的;當然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。
//如置為NO,建議自己添加對應域名的校驗邏輯。
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil];
return securityPolicy;
}
其中https.cer制作方法如下:
向服務器要配置服務器https時生成的server.crt 文件
然后在命令行輸入命令 :
openssl x509 -in server.crt -out client.cer -outform der
將生成 的.cer 文件導入你的工程(直接拖入即可)
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。