AFNetWorking使用自簽證書驗證

In order to validate a domain name for self signed certificates, you MUST use pinning
上述問題的解決方法:數組

securityPoliy.allowInvalidCertificates = YES;//若是是須要驗證自建證書,須要設置爲YES
securityPoliy.validatesDomainName = NO;//不驗證證書的域名

驗證證書步驟:

  1. 從服務器要來.crt格式的證書,而後用Mac鑰匙串打開,而後導出 .cer格式的證書
  • .cer證書導入程序的 中。
  • 驗證證書的代碼:
/**
 https證書驗證
 */
+(AFSecurityPolicy*)customSecurityPolicy
{
    // /先導入證書
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"cer"];//證書的路徑
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    // AFSSLPinningModeCertificate 使用證書驗證模式 (AFSSLPinningModeCertificate是證書全部字段都同樣才經過認證,AFSSLPinningModePublicKey只認證公鑰那一段,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 *)@[certData];
    return securityPolicy;
}

其中的cerPath就是app bundle中證書路徑,certificate爲證書名稱的宏,僅支持cer格式,securityPolicy的相關配置尤其重要,請仔細閱讀customSecurityPolicy方法並根據實際狀況設置其屬性。安全

這樣,就可以在AFNetWorking的基礎上使用HTTPS協議訪問特定服務器,可是不能信任根證書的CA文件,所以這種方式存在風險,讀取pinnedCertificates中的證書數組的時候有可能失敗,若是證書不符合,certData就會爲nil。服務器

  • 在發送請求時候 加上這行代碼,https ssl 驗證。
//    [[AFHTTPSessionManager manager] setSecurityPolicy:[JYAFNetworkingManager customSecurityPolicy]];
相關文章
相關標籤/搜索