searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Node urllib库遇到ERR_TLS -CERT_ALTNAME_INVALID解决方法

2024-06-18 09:32:16
37
0

在本地开发中使用Node.js [urllib]库联调测试环境https接口时,出现 [ERR_TLS -CERT_ALTNAME_INVALID]: Hostname/Ip does not match certificate's altnames报错,即服务器主机和证书不匹配,而同事用Golang却能正常请求,经过一番折腾终于找到原因并解决,记录一下填坑笔记。

Node.js从0.9.2版本开始就默认验证证书,而请求的测试环境https证书并不是从权威机构颁发的,而Go、Java等其它语言能正常请求是因为没有默认校验证书,所以会出现这种报错,于是解决问题就有两种方式1、测试环境更新证书;2、node请求不默认校验证书。方法一不大可行,公司不可能为了适配Node端更换证书,此时就只有方法二可行了,网上得到的解决办法是在请求时加上{rejectUnauthorized:false}选项不再校验证书的安全性,但这具有 严重的安全隐患。发送给对等方的任何内容仍将被加密,但发起中间人攻击变得更加容易,即数据将被加密给对等方,但对等方本身可能并不是认为的服务器!因为是在测试环境联调就采用此种方式,​生产必须要校验证书安全性的​。

于是满怀希望的准备采用方式二解决问题,但是[urllib]官方文档并没有给出初始化请求的选项,自己给options里面强制加了 {rejectUnauthorized:false} 并没有生效,希望破灭,陷入沉思。urllib这种week下载量几十万的库,连node这种基本的配置不可能不支持,肯定是作者为了安全因素隐藏了,只暴露出一个简单的 request 方法,这个方法又是如何初始化的呢,顺藤摸瓜进入node_modules下对应的目录,并找到了初始化方法和可支持的现象,自己加个选项就能解决问题,具体代码如下:

let client = null
function initClient(secure = true) {
  if (client) return client
  client = new HttpClient({
    connect: {
      rejectUnauthorized: secure
    }
  })
  return client
}
exports.initClient = initClient
0条评论
0 / 1000
谭****成
1文章数
0粉丝数
谭****成
1 文章 | 0 粉丝
谭****成
1文章数
0粉丝数
谭****成
1 文章 | 0 粉丝
原创

Node urllib库遇到ERR_TLS -CERT_ALTNAME_INVALID解决方法

2024-06-18 09:32:16
37
0

在本地开发中使用Node.js [urllib]库联调测试环境https接口时,出现 [ERR_TLS -CERT_ALTNAME_INVALID]: Hostname/Ip does not match certificate's altnames报错,即服务器主机和证书不匹配,而同事用Golang却能正常请求,经过一番折腾终于找到原因并解决,记录一下填坑笔记。

Node.js从0.9.2版本开始就默认验证证书,而请求的测试环境https证书并不是从权威机构颁发的,而Go、Java等其它语言能正常请求是因为没有默认校验证书,所以会出现这种报错,于是解决问题就有两种方式1、测试环境更新证书;2、node请求不默认校验证书。方法一不大可行,公司不可能为了适配Node端更换证书,此时就只有方法二可行了,网上得到的解决办法是在请求时加上{rejectUnauthorized:false}选项不再校验证书的安全性,但这具有 严重的安全隐患。发送给对等方的任何内容仍将被加密,但发起中间人攻击变得更加容易,即数据将被加密给对等方,但对等方本身可能并不是认为的服务器!因为是在测试环境联调就采用此种方式,​生产必须要校验证书安全性的​。

于是满怀希望的准备采用方式二解决问题,但是[urllib]官方文档并没有给出初始化请求的选项,自己给options里面强制加了 {rejectUnauthorized:false} 并没有生效,希望破灭,陷入沉思。urllib这种week下载量几十万的库,连node这种基本的配置不可能不支持,肯定是作者为了安全因素隐藏了,只暴露出一个简单的 request 方法,这个方法又是如何初始化的呢,顺藤摸瓜进入node_modules下对应的目录,并找到了初始化方法和可支持的现象,自己加个选项就能解决问题,具体代码如下:

let client = null
function initClient(secure = true) {
  if (client) return client
  client = new HttpClient({
    connect: {
      rejectUnauthorized: secure
    }
  })
  return client
}
exports.initClient = initClient
文章来自个人专栏
Node开发填坑笔记
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0