在本地开发中使用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