目錄
- 前言
- 鴻蒙應用中的網絡請求
- rcp 抓包
- http 抓包
- 以下是排查過程,沒啥參考價值
- 發送文件
- http 抓包報錯
前言
抓包,對于各位開發者應該不陌生,各種抓包工具應該的都聽說過,像 charles、fiddler、Wireshark?等。在 Android 和 iOS 上抓包都挺簡單的,把證書存放到手機上,然后安裝一下,網絡設置里面配置一下代理,代碼里面忽略一下證書校驗或者信任一下用戶證書就好了。
但在鴻蒙手機上,似乎第一步把證書存放到手機上就卡住了一部分人。
鴻蒙應用中的網絡請求
在開發文檔中有提到兩種網絡請求的方法,一開始是用 http,再后來推薦使用 rcp。現在上架的應用估計大部分是用的 http 或者axios 這個封裝好的框架進行的網絡請求。
rcp 抓包
在官方文檔中,并沒有找到http 如何忽略證書校驗或者信任用戶證書,只翻到了如何使用自定義證書。
嘿嘿,問題不大,因為我們用的是 rcp 做的網絡請求,自己封裝了一下。并且在官方文檔中找到了跳過證書校驗的配置:
SecurityConfiguration接口允許開發人員在會話中配置與安全相關的設置,包括證書和服務器身份驗證。
其中有個屬性:remoteValidation,解釋說明是證書頒發機構(CA),用于驗證遠程服務器的身份。默認值為’system’。
我們可以配置的類型有:"system"
、"skip"
、CertificateAuthority
、ValidationCallback
,其中默認值為’system’。
如果未設置此字段,系統CA將被用于驗證遠程服務器的標識。
‘system’:表示使用系統CA配置。
‘skip’:跳過驗證。
CertificateAuthority:證書頒發機構(CA)驗證。
ValidationCallback:自定義證書校驗。
這不就簡單了么,整個 demo 試一下
Button('charles抓包 rcp').onClick((_)=>{const session = rcp.createSession();const request = new rcp.Request('https:/xxxxxx','GET');request.configuration = {security: {remoteValidation: 'skip',},};session.fetch(request).then((rep: rcp.Response) => {console.info(`Response succeeded: ${rep}`);}).catch((err: BusinessError) => {console.error(`Response err: Code is ${err.code}, message is ${err.message}`);});});
打開抓包軟件,手機 wifi 設置里面配置一下代理,就可以看到能抓包了,甚至不需要安裝證書。
http 抓包
由于沒有找到如何忽略證書,就和 Android 抓包一樣,先把證書安裝到手機上。
在抓包軟件中導出證書,注意查看一下證書的有效期,當然安裝抓包軟件的電腦上也需要安裝一下證書,并且需要信任才行。
然后使用hdc file send
將證書發送到手機上,問題就在這里,不知道手機的文件夾目錄是啥。
hdc file send charles-ssl-proxying-certificate.pem /storage/media/100/local/files/Docs/Download/charles.pem
這里的目標路徑為/storage/media/100/local/files/Docs/Download/
,也就是我們在手機文件管理里面看到的Download
文件夾。這里需要注意的是,需要在后面加目標文件的名字,這也是和Android的adb psuh
最大的區別,adb 只需要指定到文件夾就好,相當于把文件復制到這個文件夾中,復制之后的名字可以不指定。
我們可以在 DevEco 的右下角Device File Browser
把文件夾展開看一下:
然后我們打開證書安裝頁面:hdc shell aa start -a MainAbility -b com.ohos.certmanager
,或者在手機設置–>隱私和安全–>高級–>證書與憑據–>從存儲設備安裝,點擊 CA 證書,會彈出警告彈窗,我們點擊繼續,找到我們剛才發送到設備的證書,完成安裝
隨后擼一坨代碼測試一下
Button('charles抓包 http').onClick((_)=>{let httpRequest = http.createHttp();httpRequest.request(// 填寫HTTP請求的URL地址,可以帶參數也可以不帶參數。URL地址需要開發者自定義。請求的參數可以在extraData中指定"https://xxxxx",{method: http.RequestMethod.GET, // 可選,默認為http.RequestMethod.GET// 開發者根據自身業務需要添加header字段header: {'Content-Type': 'application/x-www-form-urlencoded'},expectDataType: http.HttpDataType.STRING, // 可選,指定返回數據的類型priority: 1, // 可選,默認為1connectTimeout: 60000, // 可選,默認為60000msreadTimeout: 60000, // 可選,默認為60000msusingProxy: true, // 可選,默認不使用網絡代理,自API 10開始支持該屬性// caPath:filePath}, (err: BusinessError, data: http.HttpResponse) => {if (!err) {// data.result為HTTP響應內容,可根據業務需要進行解析console.info('Result:' + JSON.stringify(data.result));console.info('code:' + JSON.stringify(data.responseCode));// data.header為HTTP響應頭,可根據業務需要進行解析console.info('header:' + JSON.stringify(data.header));console.info('cookies:' + JSON.stringify(data.cookies)); // 8+// 當該請求使用完畢時,調用destroy方法主動銷毀httpRequest.destroy();} else {console.error('error:' + JSON.stringify(err));// 當該請求使用完畢時,調用destroy方法主動銷毀httpRequest.destroy();console.error("flutter 鴻蒙打點:")}});})
同樣的操作,熟悉的配方就可以看到抓包結果了。
以下是排查過程,沒啥參考價值
發送文件
一開始使用 hdc 發送文件一直失敗,一個原因是找不到正確的文件夾,另外一個原因就是沒有加指定目標文件的文件名,路徑只寫到了某個文件夾。
還想嘗試使用手機上登錄微信,通過微信發送。
藍牙配對一下,使用藍牙發送。
電腦上搞個 ftp,手機上訪問下載一下。
這些方案應該都能解決文件傳輸問題,但我就想用 hdc 搞定一下,折騰了好半天,搜了一摞一摞的教程。。。
http 抓包報錯
安裝完證書,配置好代理之后抓包時發現 http 請求失敗,報錯2300060 遠程服務器SSL證書或SSH秘鑰不正確
.
剛開始以為是在 http 請求中需求配置點什么屬性,比如usingProxy
這個屬性:可以配置屬性值類型boolean
或者HttpProxy
。
首先設置為 true,抓包還是不行。
設置為HttpProxy
對象,地址就寫電腦的 ip 和抓包軟件中設置的對應的端口號,結果還是報錯。
然后就以為需要把證書拷貝到沙箱目錄,然后走自定義證書那一套流程,結果還是不行,照樣是2300060
這個錯誤碼。
之后就去翻官方文檔,看到有個提示
然后看了下證書有效期,果然是證書過期了,但奇怪的是在 Android 上可以抓包。解決方案就是在抓包軟件里面重置一下證書,再重新導出一下,安裝到手機上就可以了。
為啥會關心這兩個網絡請求抓包:因為有個立項比較早的項目,是由前端主導的,當時還沒有 rcp,于是選擇了axios。后面又立項了另外一個項目,是客戶端主導的,并且這時候官方文檔也開始推薦使用 rcp 了。
以上