尝试执行POST请求时出现[ERR_TLS_CERT_ALRTNAME_INVALID]错误

时间:2020-01-19 15:21:36

标签: node.js ssl

我正在尝试向特定域发出POST请求(我将其称为api.example.com/base),但我无法通过conditional SSL certificate checking nodejs does in the tls module。我可以在Curl中执行相同的POST请求而不会出现问题,并且我可以向nodejs中的其他域执行POST请求,但不能对此特定域(在Curl中也可以正常工作)进行

POST请求:

function PostReq() {

    let chunks = [], resData = '';

    const postData = decodeURIComponent(qs.stringify({
        property1: 'value1',
        property2: 'value2'
    }));

    const options = {
        headers: {
            host: 'api.example.com',
            path: '/base',
            port: 443,
            method: 'POST',
            'Content-Type': 'application/x-www-form-urlencoded;',
            'Content-Length': Buffer.byteLength(postData),
        }
    };


    const reqPost = https.request(options, (res) => {

        res.setEncoding('utf8');
        if (res.statusCode === 200) {
            console.log('got successfull http response');

            res.on('data', (chunk) => {
                console.log('getting chunks...');
                chunks.push(chunk);
            });

            res.on('end', () => {
                resData = Buffer.concat(chunks).toString();
                console.log('response body data: ', resData);
            });
        } else {
            console.error('received http status code: ', res.Statuscode);
        }
    });

    reqPost.write(postData);

    reqPost.on('error', (err) => {
        console.error('error: ', err);
    });

    reqPost.end();
}
PostReq();

错误消息:

Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: Host: api.example.com. is not in the cert's altnames: mydomain.com, DNS:www.mydomain.com
    at Object.checkServerIdentity (tls.js:283:12)
    at TLSSocket.onConnectSecure (_tls_wrap.js:1331:27)
    at TLSSocket.emit (events.js:223:5)
    at TLSSocket._finishInit (_tls_wrap.js:794:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:608:12) {
  reason: "Host: api.example.com. is not in the cert's altnames: mydomain.com, DNS:www.mydomain.com" 

堆栈:

  • nodejs
  • expressjs
  • nginx
  • nginx反向代理
  • letsencrypt ssl证书

nginx或letsencrypt日志中都没有错误,所以很好。

我曾尝试将NPM配置设置ssl-strict设置为false,但没有帮助。有一种可能可行的解决方案,将 rejectUnauthorized 值设置为 false ,但这会导致严重的安全问题,如果有人知道这是什么,我会尽量避免让id感激。在这里进行以及如何解决。

1 个答案:

答案 0 :(得分:0)

已解决。

我在上面的代码中犯了一个非常明显的错误,我在headers对象中添加了所有options属性。

我做了什么:

const options = {
    headers: {
        host: 'api.example.com',
        path: '/base',
        port: 443,
        method: 'POST',
        'Content-Type': 'application/x-www-form-urlencoded;',
        'Content-Length': Buffer.byteLength(postData),
    }
};

我应该做的(正确的方法):

const options = {
    host: 'api.example.com',
    path: '/base',
    port: 443,
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded;',
        'Content-Length': Buffer.byteLength(postData)
    }
};

因此,如果您遇到此问题,请仔细检查您的代码格式,有时该问题只是一个简单的缺陷!