實(shí)際問(wèn)題場(chǎng)景描述
使用dio框架發(fā)起的網(wǎng)絡(luò)請(qǐng)求,手機(jī)上都配置好一切后,Charles卻沒(méi)法抓到包。
問(wèn)題分析
需要知識(shí)儲(chǔ)備:https的ssl加密實(shí)現(xiàn)、charles抓https包的原理
問(wèn)題原因
- Flutter應(yīng)用中常用的HTTP客戶端庫(kù)(如Dio或http)是獨(dú)立使用Dart語(yǔ)言的HTTP實(shí)現(xiàn),未直接使用系統(tǒng)級(jí)的網(wǎng)絡(luò)堆棧,所以它們不會(huì)自動(dòng)繼承系統(tǒng)代理配置,因此系統(tǒng)上的代理配置無(wú)法生效。
- 在Dart/Flutter中,也就是框架層面,默認(rèn)的HTTP客戶端不信任自簽名證書,網(wǎng)絡(luò)庫(kù)(如Dio或http)層繼承了這個(gè)默認(rèn)配置。
問(wèn)題解決
需在dart代碼內(nèi),手動(dòng)指定代理ip和端口。(可以自己寫一個(gè)簡(jiǎn)單的小頁(yè)面,來(lái)配置代理,指定代理端口和ip)
如果使用的是dio庫(kù),如下
dio!.httpClientAdapter = IOHttpClientAdapter(
createHttpClient: () {
final client =
HttpClient(context: SecurityContext(withTrustedRoots: false));
client.findProxy = (uri) {
return 'PROXY $proxyIp:$proxyPort'; // proxyIp: 代理ip,proxyPort:代理端口
};
client.badCertificateCallback =
(X509Certificate cert, String host, int port) => true; // 允許自簽名證書
return client;
},
);
如果使用的是Http庫(kù),如下
HttpClient client = HttpClient();
client.findProxy = (uri) {
return "PROXY $proxyIp:$proxyPort"; // proxyIp: 代理ip,proxyPort:代理端口
};
client.badCertificateCallback = (X509Certificate cert, String host, int port) => true; // // 允許自簽名證書
提問(wèn)
為什么Flutter的dio不支持類似安卓/iOS原生應(yīng)用一樣直接被抓包?
- SSL Pinning:Flutter 默認(rèn)情況下沒(méi)有啟用 SSL Pinning,但它會(huì)對(duì) SSL 證書進(jìn)行驗(yàn)證。抓包工具通常通過(guò)代理和自簽名證書來(lái)解密 HTTPS 流量,因此需要忽略 SSL 證書錯(cuò)誤才能進(jìn)行抓包。
-
網(wǎng)絡(luò)庫(kù)的行為:Flutter 使用
dart:io庫(kù)進(jìn)行網(wǎng)絡(luò)請(qǐng)求,該庫(kù)在進(jìn)行 HTTPS 請(qǐng)求時(shí)會(huì)驗(yàn)證服務(wù)器的 SSL 證書。 - 中間人攻擊防護(hù):忽略 SSL 證書錯(cuò)誤可能會(huì)讓應(yīng)用暴露于中間人攻擊,因此只應(yīng)在開(kāi)發(fā)和調(diào)試時(shí)使用,在生產(chǎn)環(huán)境中絕對(duì)不要忽略 SSL 證書錯(cuò)誤。
- 在Flutter應(yīng)用中不配置代理,網(wǎng)絡(luò)請(qǐng)求默認(rèn)不會(huì)走系統(tǒng)代理,這是因?yàn)镕lutter的網(wǎng)絡(luò)請(qǐng)求使用了獨(dú)立的網(wǎng)絡(luò)庫(kù)(如
dart:io),而不是依賴操作系統(tǒng)的網(wǎng)絡(luò)堆棧
總結(jié):
- Flutter對(duì)SSL證書的驗(yàn)證更嚴(yán)格,而charles使用的不是受信任機(jī)構(gòu)頒發(fā)的證書,所以在驗(yàn)證SSL證書的時(shí)候報(bào)錯(cuò)了
- 對(duì)比iOS來(lái)說(shuō),AFNetworking會(huì)依賴操作系統(tǒng)提供的信任機(jī)制來(lái)驗(yàn)證 HTTPS 請(qǐng)求的安全性,而flutter沒(méi)有依賴系統(tǒng)信任機(jī)制。