nodejs中request庫使用HTTPS代理
正在嘗試改用NodeJS編寫爬蟲,http請求庫選擇了request ,用起來還是挺簡單的。
現在有個需求,需要用Fiddler抓包我發出去的請求,以便和瀏覽器發出去的包進行對比。
因為需要解密HTTPS報文,需要讓node要麼忽略證書安全,要麼信任Fiddler的CA證書。
網上找了一圈,總結如下:
設定環境變數
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
每請求單獨設定忽略證書安全
- 上述方法還是有一定風險,因為當前nodejs程序都受此全域性設定影響
-
可以在request的options中新增
rejectUnauthorized: false
選項來針對單個請求忽略證書檢查 -
當然也可以用request.defaults直接設定預設選項
const request = require("request").defaults({ proxy: "http://127.0.0.1:8888", rejectUnauthorized: false, }) request.get("https://www.baidu.com").on("response", console.log)
直接使用Fiddler的CA證書
- 這個方法是最穩妥的,不會對你的子系統之外產生任何溢位影響
- 首先在Fiddler內把其根證書匯出到桌面:Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop
-
匯出的檔案是個.cer證書,經測試nodejs不直接支援,需要用openssl轉換成PEM格式(我的openssl是cygwin裝的)
openssl x509 -inform DER -in FiddlerRoot.cer -outform PEM -out fiddler.pem
- 把轉換出來的fiddler.pem放到你的程式能訪問的位置
-
使用
ca
選項來指定CA證書const request = require("request").defaults({ proxy: "http://127.0.0.1:8888", ca: require("fs").readFileSync("path/to/fiddler.pem", {encoding: "utf-8"}), }) request.get("https://www.baidu.com").on("response", console.log)
另外:request當然也支援自簽名證書,不過我暫時沒這方面需求,就沒繼續摸索了