Error Domain=NSURLErrorDomain Code=-999 "cancelled"

現象:

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 文件導入你的工程(直接拖入即可)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容