it-swarm.com.ru

nodejs ssl "невозможно получить сертификат локального эмитента"

Мне дали сертификат SSL для подписи клиентских запросов, а также соответствующие сертификаты ЦС. Я могу проверить это с помощью openssl:

$ openssl s_client -CAfile /etc/ssl/foo/ca-combined.pem -servername foo.co.in -connect foo.co.in:443
CONNECTED(00000003)
... snip ...
Verify return code: 0 (ok)
---
closed

(Я разобрал 2 сертификата CA в один файл). Но когда я пытаюсь скопировать его с помощью узла:

    var tls = require('tls');
    var fs = require('fs');

    var options = { 
        Host: 'foo.co.in',
        servername: 'foo.co.in',
        port: 443,
        key: fs.readFileSync('/etc/ssl/private/foo.key'),
        cert: fs.readFileSync('/etc/ssl/foo/cert.pem'),
        ca: [fs.readFileSync('/etc/ssl/foo/combined-ca.pem')]
    };  

    tls.connect(options, function(err) {
        done(err);
    });

Я получаю ошибку:

Uncaught Error: unable to get local issuer certificate
  at Error (native)
  at TLSSocket.<anonymous> (_tls_wrap.js:1092:38)
  at TLSSocket._finishInit (_tls_wrap.js:610:8)
  at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38)

Я нашел ответ здесь, предполагая, что мне нужно поместить каждый сертификат CA в отдельный файл:

ca: [fs.readFileSync('/etc/ssl/foo/ca.pem'), fs.readFileSync('/etc/ssl/foo/root-ca.pem')]

но это все равно дало ту же ошибку. (Я также попытался изменить порядок). Затем я попытался вставить промежуточный сертификат вместе с клиентским, и просто предоставил сертификат корневого CA как ca (что, как кажется в docs ), та же ошибка. На данный момент у меня заканчиваются идеи. Тот факт, что openssl счастлив, говорит о том, что я делаю что-то не так, какие-либо предложения?

$ node --version
v6.10.1

(Я понимаю, что могу установить для rejectUnauthorized значение false, но на самом деле лучше не делать этого)

7
grahamrhay

Оказывается, мне не нужно было предоставлять сертификат CA, поскольку их CA был надлежащим образом подписан «известным» органом. Так что я мог просто удалить поле ca из моего запроса.

1
grahamrhay

Я создал сертификаты root-ca и промежуточный-ca (подписанный root-ca), затем я создал сертификаты сервера и клиента, подписанные промежуточным-ca. Чтобы проверить это, я реализовал сервер и клиент https с помощью nodejs, поэтому настроил его с помощью сертификатов и получил следующую ошибку на моем клиенте:

problem with request: unable to get local issuer certificate

Чтобы решить эту проблему, мне нужно указать в моих кодах nodejs поле ca, мои сертификаты root-ca и промежуточный ca. Как это:

key: fs.readFileSync('path/client.privkey.pem'),
cert: fs.readFileSync('path/client.cert.pem'),
ca: [ fs.readFileSync('path/intermed-ca.cert.pem'), fs.readFileSync('path/root-ca.cert.pem') ],

меня устраивает.

1
jefferson ferreira palheta