對于AFN設置https請求犯建,有兩個途徑,一個是避開域名驗證瓜客,一個是配置證書适瓦。下面就來記錄一下這兩個方法,方便以后使用谱仪。(好記性不如爛筆頭)
-
避開域名驗證
1玻熙、先在info.plist
配置
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<YES/>
</dict>
2、設置AFSecurityPolicy
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];
securityPolicy.validatesDomainName = NO;
securityPolicy.allowInvalidCertificates = YES;
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
sessionManager.securityPolicy = securityPolicy;
-
配置證書
1疯攒、先去網(wǎng)站上下載證書嗦随,如下圖所示
image.png
image.png
如果服務端給的是crt后綴的證書,因為iOS客戶端用到的cer證書卸例,所以需要自行轉換称杨;
.crt轉.cer證書方法:
同樣方法將.crt證書下載到桌面上,打開終端筷转,cd到.crt證書的路勁下姑原,
執(zhí)行命令
openssl x509 -in 你的證書.crt -out 你的證書.cer -outform der
就會在桌面上看到一個.cer的證書。雙擊導入電腦呜舒,然后在鑰匙串中找到證書锭汛,并設置信任。
直接把轉換好的cer文件拖動到工程中
2袭蝗、在AFN里面設置
AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:Base_URL]];
[sessionManager setSecurityPolicy:[self customSecurityPolicy]];
- (AFSecurityPolicy *)customSecurityPolicy {
// 先導入證書 證書由服務端生成唤殴,具體由服務端人員操作
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"app.wangdasong.top" ofType:@"cer"];//證書的路徑
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用證書驗證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO
// 如果是需要驗證自建證書到腥,需要設置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗證域名朵逝,默認為YES;
//假如證書的域名與你請求的域名不一致,需把該項設置為NO乡范;如設成NO的話配名,即服務器使用其他可信任機構頒發(fā)的證書啤咽,也可以建立連接,這個非常危險渠脉,建議打開宇整。
//置為NO,主要用于這種情況:客戶端請求的是子域名芋膘,而證書上的是另外一個域名鳞青。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com为朋,那么mail.google.com是無法驗證通過的臂拓;當然,有錢可以注冊通配符的域名*.google.com潜腻,但這個還是比較貴的埃儿。
//如置為NO,建議自己添加對應域名的校驗邏輯融涣。
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = [[NSSet alloc]initWithObjects:cerData, nil];
return securityPolicy;
}
錯誤信息收錄(以后遇到會持續(xù)更新)
A security policy configured with AFSSLPinningModeCertificate can only be applied on a manager with a secure base URL (i.e. https)
其實這個錯誤已經(jīng)告訴我們是證書安全的問題童番,我們在封裝網(wǎng)絡請求的時候
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];//只寫了這部分,現(xiàn)在要求這樣寫:
AFHTTPSessionManager * manager = [[AFHTTPSessionManager manager]initWithBaseURL:[NSURL URLWithString:url]];//URL就是你們服務器的URL前綴
??[AFHTTPSessionManager manager]
這個需要寫個單例威鹿,不然就會內(nèi)存泄漏