Получается ошибка "CERT_UNTRUSTED" при выполнении HTTPS-запроса на стороне сервера в приложении Node.JS?
Мое приложение Node.JS/Express получает следующую ошибку при попытке запроса HTTPS GET из кода моего сервера в API, обслуживаемый другим сервером (другой компанией, сервер не принадлежит нам):
CERT_UNTRUSTED
ПРИМЕЧАНИЕ. Я запускаю эти тесты из своего Linux-бокса, используя домен "localhost".
Я попытался выполнить шаги, описанные в этой статье, чтобы создать самозаверяющий временный сертификат, просто чтобы обойти эту проблему:
http://www.hacksparrow.com/node-js-https-ssl-certificate.html
Тем не менее, я все еще получаю ошибку. (Примечание: поскольку я создал сервер с ключами SSL, загруженными с использованием модуля HTTPS, сервер теперь отвечает только на URL-запросы HTTPS (https://). Сервер больше не отвечает на запросы не HTTPS, так как я его настроил чтобы загрузить мои файлы SSL PEM при создании сервера. Как ни странно, он печатает два запроса "прослушивание сервера через порт", когда он печатал только один).
Как я могу это исправить?
ПРИМЕЧАНИЕ. Свойство имени хоста в объекте параметров в приведенном ниже коде было изменено на "фиктивный" URL-адрес, поскольку оно является конфиденциальным. Если вы попробуете URL, вы получите ошибку.
Выдержки из кода:
var https = require('https');
https.globalAgent.options.secureProtocol = 'SSLv3_method';
var httpsOptions = {
hostname: dummyHostName,
port: 80,
method: 'GET',
path: '/search?text=test',
headers: {
// Request JSON response.
'Content-Type': 'application/json',
'Upgrade-Insecure-Requests': '1',
'json': 'true'
}};
var httpsReq =
https.request(httpsOptions,
function (resHttp) {
// This block is never reached due to the error.
}
Я попытался установить пакет ssl-root-cas NPM согласно этому документу:
https://github.com/coolaj86/node-ssl-root-cas
Но я не мог понять, какие PEM-файлы мне нужно было загрузить в разделе USAGE в инструкциях, в которых указаны фиктивные имена файлов, поэтому я не думаю, что использую их правильно.
Вот мой список пакетов для приложения:
┬─┬ body-parser@1.13.3 │ ├── bytes@2.1.0 │ ├── content-type@1.0.1 │ ├── depd@1.0.1 │ ├─┬ http-errors@1.3.1 │ │ ├── унаследовал @ 2.0.0 │ │ └── statuses@1.2.1 │ ├── iconv-lite@0.4.11 │ ├─┬ on-finished@2.3.0 │ │ └── ee-first@1.1.1 │ ├── qs@4.0.0 │ ├─┬ raw-body@2.1.6 │ │ ├── bytes@2.3.0 │ │ ├── iconv-lite@0.4.13 │ │ └── unpipe@1.0.0 │ └─┬ type-is@1.6.12 │ ├── media-typer@0.3.0 │ └─┬ mime-types@2.1.10 │ └── mime-db@1.22.0 ┬─┬ cookie-parser@1.3.5 │ ├── cookie@0.1.3 │ └── cookie-signature@1.0.6 ├─┬ debug@2.2.0 │ └── ms@0.7.1 ├─┬ express@4.13.4 │ ├─┬ accepts@1.2.13 │ │ ├─┬ mime-types@2.1.10 │ │ │ └── mime-db@1.22.0 │ │ └──gotiator@0.5.3 │ Array── array-flatten@1.1.1 │ ├── content-disposition@0.5.1 │ ├── content-type@1.0.1 │ ├── cookie@0.1.5 │ ├── cookie-signature@1.0.6 │ ├── depd@1.1.0 │ ├── escape-html@1.0.3 │ ├── etag@1.7.0 │ ├─┬ finalhandler@0.4.1 │ │ └── unpipe@1.0.0 │ ├── fresh@0.3.0 │ ├── merge-descriptors@1.0.1 │ ├── method@1.1.2 │ ├─┬ готово @ 2.3.0 │ │ └── ee-first@1.1.1 │ ├── parseurl@1.3.1 │ ├── path-to-regexp@0.1.7 │ ├─┬ proxy-addr@1.0.10 │ For ├── forwarded@0.1.0 │ │ └── ipaddr.js@1.0.5 │ ├── qs@4.0.0 │ ├── range-parser@1.0.3 │ ├─┬ send@0.13.1 │ │ ├── destroy@1.0.4 │ │ ├─┬ http-errors@1.3.1 │ │ │ └── Legits@2.0.1 │ │ ├── mime@1.3.4 │ │ ├── ms@0.7.1 │ │ └── statuses@1.2.1 │ ├── serve-static@1.10.2 ┬ ├─┬ type-is@1.6.12 │ │ ├── media-typer@0.3.0 │ │ └─┬ mime-types@2.1.10 │ │ └── mime-db@1.22.0 │ ├── utils-merge@1.0.0 │ ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────...0 │ │ └─┬ brace-expansion@1.1.3 │ │ ├── balance-match@0.3.0 │ │ └── concat-map@0.0.1 │ ├─┬ Once@1.3.3 │ │ └── wrappy@1.0.1 │ └── path-is-absolute@1.0.0 ├── http-status-codes@1.0.6 ├─┬ jade@1.11.0 │ ├── character-parser@1.2.1 ┬ ├─┬ clean-css@3.4.12 │ │ ├─┬ commander@2.8.1 │ │ │ └── graceful-readlink@1.0.1 │ │ └─┬ source-map@0.4.4 │ │ └── amdefine@1.0.0 │ ├── commander@2.6.0 │ ├─┬ constantinople@3.0.2 │ │ └── acorn@2.7.0 │ ├─┬ jstransformer@0.0.2 │ │ ├── is-promise@2.1.0 │ │ └─┬ обещание@6.1.0 │ │ └── asap@1.0.0 │ ├─┬ mkdirp@0.5.1 │ │ └── minimist@0.0.8 │ ├─┬ трансформаторы @2.1.0 │ │ ├─┬ css@1.0.8 │ │ │ ├─ css-parse@1.0.4 │ │ │ └── css-stringify@1.0.5 │ │ ├─┬ обещание@2.0.0 │ │ │ └── is-promise@1.0.1 │ │ └─┬ uglify-js@2.2.5 │ │ ├─┬ optimist@0.3.7 │ │ │ └── wordwrap@0.0.3 │ │ └─┬ source-map@0.1.43 │ │ └── amdefine@1.0.0 │ ┬─┬ uglify-js@2.6.2 │ │ ├── async@0.2.10 │ │ ├── source-map@0.5.3 │ │ ├── uglify-to-browserify@1.0.2 │ │ └─ Ar yargs@3.10.0 │ │ ├── camelcase@1.2.1 │ │ ├─┬ cliui@2.1.0 │ │ │ ├─┬ center-align@0.1.3 │ │ │ │ ├─┬ align-text@0.1.4 is │ │ │ │ ├─┬ kind-of@3.0.2 is │ │ │ │ │ └── is-buffer@1.1.3 │ │ │ │ │ ├── longest@1.0.1 │ │ │ Repeat │ └── repeat-string@1.5.4 │ │ │ │ └── lazy-cache@1.0.3 │ │ │ ├─┬ right-align@0.1.3 │ │ │ │ └─┬ align-text@0.1.4 ┬ │ │ │ ├─┬ kind-of@3.0.2 │ │ │ │ Is── is-buffer@1.1.3 │ │ │ │ ├── longest@1.0.1 │ │ │ │ └── repeat-string@1.5.4 │ │ │ └── wordwrap@0.0.2 │ │ ├── decamelize@1.2.0 │ │ └── window-size@0.1.0 │ ├── void-elements@2.0.1 │ └─┬ с@4.0.3 │ ├── acorn@1.2.2 │ └─┬ acorn-globals@1.0.9 │ └── acorn@2.7.0 ├── jsonfile@2.2.3 ├─┬ morgan@1.6.1 │ ├── basic-auth@1.0.3 │ ├── depd@1.0.1 │ ├─┬ on-finished@2.3.0 │ │ └── ee-first@1.1.1 │ └── on-headers@1.0.1 ├─┬ scribe-js@2.0.4 │ ├── CallSite@1.0.0 │ ├── colors@1.1.2 │ ├─┬ mkdirp@0.5.1 │ │ └── minimist@0.0.8 │ └── moment@2.12.0 ├─┬ serve-favicon@2.3.0 │ ├── etag@1.7.0 │ ├── fresh@0.3.0 │ ├── ms@0.7.1 │ └── parseurl@1.3.1 └─┬ ssl-root-cas@1.2.2 ├── bluebird@3.4.6 └─┬ request@2.74.0 ├── aws-sign2@0.6.0 ├── aws4@1.4.1 ├ ┬ bl@1.1.2 │ └─┬ readable-stream@2.0.6 │ ├── core-util-is@1.0.2 │ ├── наследует@2.0.1 │ ├── isarray@1.0.0 │ ├── process-nextick-args@1.0.7 │ ├── string_decoder@0.10.31 util └── util-deprecate@1.0.2 ├── caseless@0.11.0 ├─┬ комбинированный-поток@1.0.5 │ Ed── delayed-stream@1.0.0 extend── extend@3.0.0 ├── forever-agent@0.6.1 ├─┬ form-data@1.0.1 │ └─┬ async@2.0.1 │ └─ ─ lodash@4.15.0 ├─┬ har-validator@2.0.6 │ ├─┬ chalk@1.1.3 │ │ ├── ansi-styles@2.2.1 │ │ ├── escape-string-regexp@1.0. 5 ┬ │ ├─┬ has-ansi@2.0.0 │ │ │ └── ansi-regex@2.0.0 │ │ ├─┬ strip-ansi@3.0.1 │ │ │ └── ansi-regex@2.0. 0 │ │ └── support-color@2.0.0 │ ├─┬ commander@2.9.0 │ │ └── graceful-readlink@1.0.1 │ ├─┬ is-my-json-valid@2.13.1 │ │ ├── generate-function@2.0.0 │ │ ├─┬ generate-object-property@1.2.0 │ │ │ └── is-property@1.0.2 │ │ ├── jsonpointer@2.0.0 │ │ └── xtend@4.0.1 │ └─┬ pinkie-promise@2.0.1 │ └── pinkie@2.0.4 ├─┬ hawk@3.1.3 │ ├── boom@2.10.1 │ ├── cryptiles@2.0.5 │ ├── hoek@2.16.3 │ └── sntp@1.0.9 ├─┬ http-signature@1.1.1 │ ├── assert-plus@0.2.0 │ ├─┬ jsprim@1.3.0 │ │ ├── extsprintf@1.0.2 │ │ ├── json-schema@0.2.2 ver │ └── verror@1.3.6 │ └─┬ sshpk@1.10.0 │ ├── asn1@0.2.3 │ ├── assert-plus@1.0.0 │ ├─┬ bcrypt-pbkdf@1.0.0 │ │ └── tweetnacl@0.14.3 │ ├── dashdash@1.14.0 │ ├── ecc-jsbn@0.1.1 │ ├── getpass@0.1.6 │ ├── jodid25519@1.0.2 │ ├── jsbn@0.1.0 │ └── tweetnacl@0.13.3 ├── is-typedarray@1.0.0 ├── isstream@0.1.2 ├── json-stringify-safe@5.0.1 ├─┬ mime-types@2.1.11 │ └── mime-db@1.23.0 ├── node-uuid@1.4.7 ├── oauth-sign@0.8.2 ├── qs@6.2.1 ├── stringstream@0.0.5 ├── tough-cookie@2.3.1 └── tunnel-agent@0.4.3
1 ответ
Если у вас есть сервер, который использует самозаверяющий сертификат (или домен сервера не совпадает с определенным в URL), то он просто шифрует данные, но не идентифицирует себя. Вот почему node.js выдаст ошибку в этом запросе, но если вы хотите проигнорировать эту проблему (что, по сути, из вашего вопроса, это то, что я понимаю), вы можете передать следующее свойство в ваши httpsOptions:
rejectUnauthorized=false
Смотрите больше информации на: