最近在整理技術點的時候發現電腦上存有一些知識點的記錄,是之前在開發的過程當中遇到的一些問題,如今再從新梳理了出來web
項目需求:防止webview裏面的數據被抓包,給app中的webview也加上https校驗,防止攻擊
https校驗原理、加密原理、證書製做等已經有不少文章介紹,相信你們已經很熟悉了;本文只講在多家服務器資源訪問的狀況下對web實現https校驗的部分。objective-c
參數 | 描述 |
---|---|
clientAuth=false | 單向SSL驗證 |
clientAuth=true | 雙向SSL驗證 |
clientAuth=want | 不強制驗證客戶端證書 |
下面展現的是常規的web雙向https校驗安全
SecTrustResultType result; SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCerts); OSStatus status = SecTrustEvaluate(serverTrust, &result); if (status == errSecSuccess && (result == kSecTrustResultProceed || result == kSecTrustResultUnspecified)) { NSURLCredential *card = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential,card); } else { completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); }
//從證書鏈中獲取概要信息 NSString *summary = CFBridgingRelease(SecCertificateCopySubjectSummary(SecTrustGetCertificateAtIndex(challenge.protectionSpace.serverTrust, 0))); NSLog(@"當前請求證書概要=%@",summary); //獲取信任管理對象,裏面包含了待驗證的證書,和自定義的策略 SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { if ([summary containsString:@".xxxx.com"]) { NSString *path = [[NSBundle mainBundle] pathForResource:@"xxxx" ofType:@"der"]; NSData *certData = [NSData dataWithContentsOfFile:path]; //從der數據中建立證書對象 NSMutableArray *pinnedCerts = [NSMutableArray arrayWithObjects:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certData), nil]; SecTrustResultType result; SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCerts); OSStatus status = SecTrustEvaluate(serverTrust, &result); if (status == errSecSuccess && (result == kSecTrustResultProceed || result == kSecTrustResultUnspecified)) { NSURLCredential *card = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential,card); } else { //中斷本次連接 completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); } }else { NSURLCredential *card = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential,card); } }else { NSURLCredential *card = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, card); }
1.通過測試對於設置了web的ATS=NO,plist是否加白名單狀況:
(1)加了白名單
不論是https仍是http均可以正常訪問,因爲設置了ATS=NO,必需校驗,代理會收到校驗的回調
(2)未加白名單
a、https能夠訪問,前提條件(1)這個域名服務器證書有效沒有過時(2)webview的校驗代理沒有和本地證書匹配,直接經過,好比不是本身公司的域名訪問
b、http沒法正常訪問服務器
2.除了web當時還考慮到圖片的安全性問題;好比某個二維碼支付界面或者好友頭像,抓包工具中設置的其它有效證書那麼也就能抓到圖片,查看源碼知道SDWebimage是不校驗本地證書的,因此若是要考慮圖片的安全性須要改這裏的源碼,和webview中校驗的方法同樣就能夠了,原理相同。app
ps:除了以上校驗客戶端和服務端的證書所有信息之外,還能夠經過 SecTrustCopyPublicKey(trust) 取出各自證書信息裏面的公鑰進行對比,也是能夠達到一樣的效果,這裏就再也不細說了,感興趣的同窗能夠本身嘗試一下。工具