2017-04-05 9 views
5

Otrzymałem certyfikat SSL do podpisywania żądań klientów, a także odpowiednich certyfikatów CA. Mogę sprawdzić go przy użyciu OpenSSL:nodejs ssl "nie można uzyskać certyfikatu lokalnego wystawcy"

$ 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 

(I puree 2 CA certyfikatów w jednym pliku). Ale gdy próbuję replikować go za pomocą węzła:

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

pojawia się błąd:

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) 

znalazłem odpowiedzi na tutaj, sugerując, że muszę umieścić każdy cert CA w oddzielnym pliku:

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

ale nadal podawał ten sam błąd. (Próbowałem również odwrócić kolejność). Następnie próbowałem wstawić certyfikat pośredni do klienta, a po prostu dostarczając certyfikat głównego CA jako ca (co wydaje się być tym, co sugeruje docs), ten sam błąd. W tym momencie brakuje mi pomysłów. Fakt, że openssl jest szczęśliwy, sugeruje, że robię coś nie tak, jakieś sugestie?

$ node --version 
v6.10.1 

(zdaję sobie sprawę, mogę ustawić rejectUnauthorized false, ale ja naprawdę raczej nie)

+0

z którego serwera baz danych korzystasz? nginx, apache lub coś innego? –

+0

to jest poza kontrolą. Dałem im CSR, i oni wygenerowali dla mnie certyfikat klienta, i dali mi certyfikaty CA – grahamrhay

Odpowiedz

2

Okazuje się, że nie trzeba dostarczać cert CA, jak ich CA został prawidłowo podpisany przez "znany" autorytet. Mogłem więc usunąć pole ca z mojej prośby.

+0

Dzięki! Ten sam problem tutaj, zaoszczędziłeś mi dużo czasu :) –

+0

Wysłałeś tutaj też eh https://github.com/nodejs/help/issues/566 –

1

Utworzyłem certyfikaty root-ca i intermediate-ca (signed by root-ca), następnie utworzyłem serwer i certyfikat klienta podpisany przez intermediate-ca. By to sprawdzić, jakie realizuje serwera i klienta https z nodejs więc ustawić go z CERT i pojawia się następujący błąd na mojego klienta:

problem with request: unable to get local issuer certificate 

go rozwiązać trzeba umieścić w moich nodejs kody, na polu CA, moje certyfikaty root-ca i intermediate-ca. W ten sposób:

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') ], 

to działa dla mnie.

Powiązane problemy