Получение ошибки [ERR_TLS_CERT_ALRTNAME_INVALID] при попытке выполнить запрос POST - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь сделать POST-запрос к определенному домену (я буду называть его api.example.com/base), но я не могу пройти условную проверку SSL-сертификата nodejs в модуле tls . Я могу сделать тот же POST-запрос в Curl без проблем, и я могу делать POST-запросы к другим доменам в nodejs отлично, но не для этого конкретного домена (который снова работает в 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 , но это вызывает проблемы безопасности ser ios, которые я пытаюсь избежать, поэтому буду благодарен, если кто-то знает, что здесь происходит и как это исправить.

1 Ответ

0 голосов
/ 22 января 2020

решено.

Я допустил довольно очевидную ошибку в своем коде выше, я добавил все свойства параметров в объект заголовков.

Что я сделал:

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)
    }
};

Так что, если вы получаете эту проблему, дважды проверьте ваш форматирование кода, иногда проблема - просто недостаток!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...