2016-02-07 3 views
5

У меня есть каталог, содержащий комплект сертификатов, скрипт Python и сценарий Node. Оба сценария делают запрос GET на тот же URL-адрес и снабжаются одним и тем же пакетом сертификатов. Сценарий Python делает запрос, как ожидается, однако сценарий узел выдает эту ошибку:Не удалось проверить первый сертификат

{ [Error: unable to verify the first certificate] code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' }

Python скрипт (Python 3.4.3 и requests библиотеку):

import requests 
print(requests.get(url, verify='/tmp/cert/cacert.pem')) 

Сценарий узел (Узел 4.2.6 и request библиотека):

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

request.get({ 
    url: url, 
    agentOptions: { 
     ca: fs.readFileSync('/tmp/cert/cacert.pem') 
    } 
}, function (error, response, body) { 
    if (error) { 
     console.log(error); 
    } else { 
     console.log(body); 
    } 
}); 

Оба используют ту же версию OpenSSL:

$ python -c 'import ssl; print(ssl.OPENSSL_VERSION)' 
OpenSSL 1.0.2e-fips 3 Dec 2015 

$ node -pe process.versions.openssl 
1.0.2e 

Я не считаю, что проблема быть с расслоением сертификата, и я не хочу, чтобы отключить проверку узла в узел.

Кто-нибудь знает, почему Node выбрасывает эту ошибку?

ответ

2

documentation описывает вариант ca следующим образом:

ca: A string, Buffer or array of strings or Buffers of trusted certificates in PEM format. If this is omitted several well known "root" CAs will be used, like VeriSign. These are used to authorize connections.

Так что не ожидает CA сверток. Однако исправление просто, просто разделить пучок следующим образом:

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

var certs = fs.readFileSync('/tmp/cert/cacert.pem').toString().split("\n\n"); 

request.get({ 
    url: url, 
    agentOptions: { 
     ca: certs 
    } 
}, function (error, response, body) { 
    if (error) { 
     console.log(error); 
    } else { 
     console.log(body); 
    } 
}); 
0

Возможно, вы можете использовать этот модуль, который исправляет проблему, путем загрузки сертификатов, обычно используемых браузерами.

https://www.npmjs.com/package/ssl-root-cas