Moya信任自簽名證書
問題
先說說HTTPS握手呀非,
發(fā)送HTTPS請(qǐng)求首先要進(jìn)行SSL/TLS握手,握手過程大致如下:
* 客戶端發(fā)起握手請(qǐng)求镜盯,攜帶隨機(jī)數(shù)岸裙、支持算法列表等參數(shù)。
* 服務(wù)端收到請(qǐng)求速缆,選擇合適的算法降允,下發(fā)公鑰證書和隨機(jī)數(shù)。
* 客戶端對(duì)服務(wù)端證書進(jìn)行校驗(yàn)艺糜,并發(fā)送隨機(jī)數(shù)信息剧董,該信息使用公鑰加密幢尚。
* 服務(wù)端通過私鑰獲取隨機(jī)數(shù)信息。
* 雙方根據(jù)以上交互的信息生成session ticket翅楼,用作該連接后續(xù)數(shù)據(jù)傳輸?shù)募用苊荑€尉剩。
第3步中,客戶端需要驗(yàn)證服務(wù)端下發(fā)的證書毅臊,驗(yàn)證過程有以下兩個(gè)要點(diǎn):
* 客戶端用本地保存的根證書解開證書鏈理茎,確認(rèn)服務(wù)端下發(fā)的證書是由可信任的機(jī)構(gòu)頒發(fā)的。
* 客戶端需要檢查證書的domain域和擴(kuò)展域管嬉,看是否包含本次請(qǐng)求的host皂林。
如果上述兩點(diǎn)都校驗(yàn)通過,就證明當(dāng)前的服務(wù)端是可信任的蚯撩,否則就是不可信任础倍,應(yīng)當(dāng)中斷當(dāng)前連接。
當(dāng)客戶端直接使用IP地址發(fā)起請(qǐng)求時(shí)胎挎,請(qǐng)求URL中的host會(huì)被替換成HTTPDNS解析出來的IP沟启,所以在證書驗(yàn)證的第2步,會(huì)出現(xiàn)domain不匹配的情況呀癣,導(dǎo)致SSL/TLS握手不成功美浦。
解決辦法
關(guān)閉Https的證書認(rèn)證
驗(yà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)])
方法一是一種變通實(shí)現(xiàn)的方法项栏,它直接關(guān)閉了Https的Domain驗(yàn)證,雖然可以請(qǐng)求正常進(jìn)行蹬竖,但是如果在客戶端和服務(wù)器之間增加代理沼沈,請(qǐng)求發(fā)送時(shí)代理替換證書,那么代理就可以輕易拿到請(qǐng)求的數(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)