Moya信任自簽名證書
問題
先說說HTTPS握手,
發(fā)送HTTPS請求首先要進行SSL/TLS握手,握手過程大致如下:
* 客戶端發(fā)起握手請求,攜帶隨機數(shù)、支持算法列表等參數(shù)。
* 服務(wù)端收到請求,選擇合適的算法,下發(fā)公鑰證書和隨機數(shù)。
* 客戶端對服務(wù)端證書進行校驗,并發(fā)送隨機數(shù)信息,該信息使用公鑰加密。
* 服務(wù)端通過私鑰獲取隨機數(shù)信息。
* 雙方根據(jù)以上交互的信息生成session ticket,用作該連接后續(xù)數(shù)據(jù)傳輸?shù)募用苊荑€。
第3步中,客戶端需要驗證服務(wù)端下發(fā)的證書,驗證過程有以下兩個要點:
* 客戶端用本地保存的根證書解開證書鏈,確認(rèn)服務(wù)端下發(fā)的證書是由可信任的機構(gòu)頒發(fā)的。
* 客戶端需要檢查證書的domain域和擴展域,看是否包含本次請求的host。
如果上述兩點都校驗通過,就證明當(dāng)前的服務(wù)端是可信任的,否則就是不可信任,應(yīng)當(dāng)中斷當(dāng)前連接。
當(dāng)客戶端直接使用IP地址發(fā)起請求時,請求URL中的host會被替換成HTTPDNS解析出來的IP,所以在證書驗證的第2步,會出現(xiàn)domain不匹配的情況,導(dǎo)致SSL/TLS握手不成功。
解決辦法
關(guān)閉Https的證書認(rèn)證
驗證自簽名證書,CN 是否合法
方法一:
```
/// 關(guān)閉https認(rèn)證
let serverTrustPolicies: [String: ServerTrustPolicy] = [
“172.16.88.106”: .disableEvaluation
]
let manager = Manager(
configuration: URLSessionConfiguration.default,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
let provider = MoyaProvider(manager: manager, plugins: [NetworkLoggerPlugin(verbose: true)])
方法一是一種變通實現(xiàn)的方法,它直接關(guān)閉了Https的Domain驗證,雖然可以請求正常進行,但是如果在客戶端和服務(wù)器之間增加代理,請求發(fā)送時代理替換證書,那么代理就可以輕易拿到請求的數(shù)據(jù),出于安全考慮并不推薦這種做法。
方法二:
ServerTrustPolicy枚舉中使用pinCertificates。
case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool)
```
傳入自簽名證書信息。
KingFisher信任Host方法
KingFisher
A lightweight, pure-Swift library for downloading and caching images from the web.
https://github.com/onevcat/Kingfisher
//取出downloader單例
let downloader = KingfisherManager.shared.downloader
//信任ip為106的Server
downloader.trustedHosts = Set(["172.16.88.106"])
//使用KingFisher給ImageView賦網(wǎng)絡(luò)圖片
iconView.kf.setImage(with: iconUrl)