nodejs中request庫使用HTTPS代理

996.icu

工具和資料

正文

正在嘗試改用NodeJS編寫爬蟲,http請求庫選擇了request,用起來仍是挺簡單的。
如今有個需求,須要用Fiddler抓包我發出去的請求,以便和瀏覽器發出去的包進行對比。
由於須要在Fiddler中解密HTTPS報文,須要讓node要麼忽略證書安全,要麼信任Fiddler的CA證書。
網上找了一圈,總結以下:javascript

方法一:設置環境變量

  • 設置環境變量NODE_TLS_REJECT_UNAUTHORIZED=0
  • 即"不拒絕未認證的證書"
  • 可是直接修改系統環境變量比較危險,由於會影響到全部nodejs的程序;比較穩妥的辦法是腳本中調用process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; 這樣僅對本進程生效

方法二:每請求單獨設置忽略證書安全

  • 上述方法仍是有必定風險,由於當前nodejs進程都受此全局設置影響
  • 能夠在request的options中添加rejectUnauthorized: false選項來針對單個請求忽略證書檢查
  • 固然也能夠用request.defaults直接設置默認選項java

    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證書node

    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固然也支持自簽名證書,不過我暫時沒這方面需求,就沒繼續摸索了git

相關文章
相關標籤/搜索