nodejs中request库使用HTTPS代理的方法


Posted in NodeJs onApril 30, 2019

正在尝试改用NodeJS编写爬虫,http请求库选择了 request ,用起来还是挺简单的。

现在有个需求,需要用Fiddler抓包我发出去的请求,以便和浏览器发出去的包进行对比。

因为需要解密HTTPS报文,需要让node要么忽略证书安全,要么信任Fiddler的CA证书。

网上找了一圈,总结如下:

方法一:设置环境变量

  • 设置环境变量NODE_TLS_REJECT_UNAUTHORIZED=0
  • 即"不拒绝未认证的证书"
  • 但是直接修改系统环境变量比较危险,因为会影响到所有nodejs的程序;比较稳妥的办法是脚本中调用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当然也支持自签名证书,不过我暂时没这方面需求,就没继续摸索了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
用nodejs写的一个简单项目打包工具
May 11 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 #NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 #NodeJs
Nodejs实现用户注册功能
Apr 14 #NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 #NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 #NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 #NodeJs
Nodejs核心模块之net和http的使用详解
Apr 02 #NodeJs
You might like
php 计划任务 检测用户连接状态
2012/03/29 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
js单例模式的两种方案
2013/10/22 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
深入学习Bootstrap表单
2016/12/13 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
Python类如何定义私有变量
2020/02/03 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
部队党性分析材料
2014/02/16 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript