Nodejs 关于Https.get报Hostname/IP doesn't match certificate's altnames错误,求助

Nodejs 关于Https.get报Hostname/IP doesn’t match certificate’s altnames错误,求助

我们用Nodejs搭建了一个微信公众平台 原来使用腾讯接口使用的是域名的形式,就是https://api.weixin.qq.com,使用Https.get方法调用是Ok的 但是应客户要求,要求把域名改成ip,把上述请求地址改成了Ip的形式https://140.206.160.101:443,然后使用Https.get调用就报Hostname/IP doesn’t match certificate’s altnames这个错误

有知道的亲们帮忙解决下


3 回复

Node.js 关于Https.get 报 “Hostname/IP doesn’t match certificate’s altnames” 错误

问题描述

我们在使用 Node.js 搭建的一个微信公众平台中,原本通过域名形式(例如 https://api.weixin.qq.com)调用腾讯接口时一切正常。然而,当我们将请求地址改为 IP 形式(例如 https://140.206.160.101:443)后,使用 Https.get 方法进行调用时却报出了 "Hostname/IP doesn't match certificate's altnames" 的错误。

原因分析

这个错误通常是因为服务器证书中的 Subject Alternative Name (SAN) 字段没有包含你尝试访问的 IP 地址。服务器的 SSL/TLS 证书通常是为特定的域名签发的,而不是为 IP 地址签发的。因此,当你尝试通过 IP 地址访问时,证书验证会失败。

解决方案

解决这个问题的一种方法是在发起 HTTPS 请求时禁用主机名检查。但这是一种不安全的做法,因为这会绕过证书验证,使你的应用容易受到中间人攻击。除非你完全信任所连接的服务器,否则不建议这样做。

以下是一个示例代码,演示如何在 Node.js 中禁用主机名检查:

const https = require('https');

const options = {
    hostname: '140.206.160.101',
    port: 443,
    path: '/your/path',
    method: 'GET',
    rejectUnauthorized: false, // 禁用主机名检查
};

const req = https.request(options, (res) => {
    let data = '';
    res.on('data', (chunk) => {
        data += chunk;
    });
    res.on('end', () => {
        console.log(data);
    });
});

req.on('error', (error) => {
    console.error(`Problem with request: ${error.message}`);
});

req.end();

注意:在生产环境中,应避免禁用主机名检查。更好的做法是确保你的服务器配置正确,并且可以接受通过 IP 地址的请求。如果可能的话,尝试使用域名而不是 IP 地址,以避免此类问题。

如果你确实需要使用 IP 地址进行请求,建议与服务器管理员合作,更新服务器证书,使其包含所需的 IP 地址或域名。


https协议是不可以使用ip的

当你从域名(如 https://api.weixin.qq.com)切换到IP地址(如 https://140.206.160.101:443)时,可能会遇到 Hostname/IP doesn't match certificate's altnames 错误。这是因为SSL证书通常是为特定的域名签发的,而不是为IP地址签发的。

解决方案

一种常见的解决方案是在发起HTTPS请求时忽略证书验证。请注意,这仅适用于测试环境,因为忽略证书验证会降低安全性。

示例代码

const https = require('https');

const options = {
    hostname: '140.206.160.101',
    port: 443,
    path: '/your/path',
    method: 'GET',
    rejectUnauthorized: false, // 忽略证书验证
    agent: false, // 禁用HTTP代理
};

const req = https.request(options, (res) => {
    let data = '';
    res.on('data', (chunk) => {
        data += chunk;
    });
    res.on('end', () => {
        console.log(data);
    });
});

req.on('error', (error) => {
    console.error(`Problem with request: ${error.message}`);
});

req.end();

解释

  1. rejectUnauthorized: 设置为 false 可以忽略证书验证。
  2. agent: 设置为 false 可以禁用HTTP代理,有助于避免一些连接问题。

注意事项

  • 在生产环境中,建议不要忽略证书验证。
  • 如果需要与特定域名的服务器通信,最好保留原来的域名形式,并确保证书正确配置。

希望这能解决你的问题!

回到顶部