2016-02-07 17 views
5

Ho una directory contenente un pacchetto di certificati, uno script Python e uno script di nodo. Entrambi gli script eseguono una richiesta GET sullo stesso URL e vengono forniti con lo stesso pacchetto di certificati. Lo script Python effettua la richiesta come previsto invece lo script del nodo getta questo errore:Impossibile verificare il primo certificato

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

Lo Script Python (Python 3.4.3 e la libreria requests):

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

Lo script del nodo (Node 4.2.6 e la libreria 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); 
    } 
}); 

Entrambi utilizzano la stessa versione 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 

Non credo il problema sia con il fascio certificato e io non voglio disattivare la verifica host nel nodo.

Qualcuno sa perché il nodo sta generando questo errore?

risposta

2

Il documentation descrive l'opzione ca come segue:

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.

Quindi non si aspetta un fascio CA. La soluzione è semplice tuttavia, basta dividere il pacchetto in questo modo:

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