這里以向https://api.github.com發(fā)送請求為例绍在。
把自定義的CA證書放入工程:
Paste_Image.png
這里以HTTP代理工具Charles作為中間人來演示。關于該工具的使用方法, 本文暫不論述. 這里僅用它來展示自簽名證書的請求效果.
https://api.github.com網址的證書實際上是正規(guī)CA
DigiCert
簽發(fā)的, 這里把Charles的CA根證書導入系統(tǒng)并設為信任后, 把Charles設為該網址的SSL Proxy (相當于"中間人"), 這樣通過代理訪問服務器返回將是由Charles偽CA簽發(fā)的證書.
本例假設 https://api.github.com的服務器證書是自簽的.
全部代碼如下:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//你請求的網絡服務返回的是JSON數(shù)據(jù)
manager.responseSerializer = [AFJSONResponseSerializer serializer];
//自定義security policy, 先前確保你的自定義CA證書已放入工程Bundle
NSSet <NSData *> *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet];
policy.allowInvalidCertificates = YES;
manager.securityPolicy = policy;
//實際應用中把https://api.github.com換為你自己要訪問的網址
[manager GET:@"https://api.github.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"responseObject:%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error.localDesc:%@", error.localizedDescription);
NSLog(@"%@", error);
}];
打印返回的數(shù)據(jù)將如下一般:
Paste_Image.png
如果服務端使用的是正規(guī)CA簽發(fā)的證書, 那么以下幾行就可去掉:
NSSet <NSData *> *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet];
policy.allowInvalidCertificates = YES;
manager.securityPolicy = policy;
采用默認的defaultPolicy
就可以了. AFN默認的securityPolicy就是它, 不必另寫代碼. AFSecurityPolicy類中會調用蘋果security.framework的機制去自行驗證本次請求服務端放回的證書是否是經過正規(guī)簽名.