Moya,KingFisher中使用自簽名證書發(fā)起HTTPS請求

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容