2012-04-13 18 views
6

Ten program testowy łączy się z serwerem https i dostaje jakąś treść. Sprawdziłem mój serwer w przeglądarkach z curl i certyfikat działa poprawnie. Jeśli uruchomię curl, aby pobrać dane z serwera, poprawnie narzeka, że ​​certyfikat jest nieznany, chyba że podaję go z --cacert lub wyłączę zabezpieczenie przy pomocy -k.Moi node.js https klient zawsze działa niezależnie od ważności certyfikatu

Tak więc problem mam jest to, że chociaż myślę, że mój klient powinien robić uwierzytelniania certyfikatów i mówię to gdzie certyfikat publiczny, po prostu zawsze działa. Jeśli usuniemy opcję ca :, więc nie ma ona pojęcia, co to jest certyfikat z serwera, działa on po cichu. Chciałbym złapać błąd uwierzytelniania, ale nie mogę tego zrobić.

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

function main() { 

     var data = ''; 

     var get = https.get({ 
     path: '/', 
     host: 'localhost', 
     port: 8000, 
     agent: false, 
     ca: [ fs.readFileSync('https_simple/cacert.pem') ] 

     }, function(x) { 

     x.setEncoding('utf8'); 
     x.on('data', function(c) {data += c}); 
     x.on('error', function(e) { 
      throw e; 
     }); 
     x.on('end', function() { 
      console.log('Hai!. Here is the response:'); 
      console.log(data); 
     }); 

     }); 

     get.on('error', function(e) {throw e}); 

     get.end(); 

    } 

main(); 

Odpowiedz

10

W celu dokonania tej pracy, co potrzebne do aktualizacji do v0.7.8 (chociaż każdy v0.7 powinno być w porządku), gdzie rejectUnauthorized funkcjonalność została dodana do https.get

Ta kombinacja opcji potrzebne:

agent: false, // or you can supply your own agent, but if you don't you must set to false 
rejectUnauthorized: true, 
ca: [ fs.readFileSync('https_simple/cacert.pem') ] 

teraz, jeśli uwierzytelnianie nie powiedzie dostaniesz zdarzenie „błędu”, a wniosek nie pójdzie do przodu.

Zobacz https.request documentation Szczegółowe informacje na temat tworzenia własnego agenta

Bug fix został popełniony w tej zmiany: https://github.com/joyent/node/commit/f8c335d0

+1

rejectUnautoryzacja została dodana w wersji 0.7.0 –

+2

Patrząc na dokumenty: http://nodejs.org/api/tls.html, nic nie wskazuje na to, że 'rejectUnautoryzowany' został dodany dla klienta ... dla serwera tak, ale nie dla klienta. .. czy możesz ustawić mnie na właściwej ścieżce? Czy patrzę tutaj na nieaktualne dokumenty? – pulkitsinghal

+0

Lista zmian znajduje się w powyższej odpowiedzi. Problem został wyśledzony tutaj https://github.com/joyent/node/issues/2247 Nie sprawdziłem, czy dokumentacja została zaktualizowana, przepraszam. – justinhj

4

Zgodnie z documentation do https.request opcja zarówno https.get i https.requestca jest rozwiązaniem z tls.connect. Dokumentacja dla opcji do funkcji modułu tls.connect stwierdza:

ca: Tablica ciągów znaków lub bufory zaufanych certyfikatów. Jeśli jest to pominięto kilka dobrze znanych "root" CA, takich jak VeriSign. Służą one do autoryzacji połączeń.

kopanie w node.js źródła, certs korzeniowe stosowane można znaleźć tutaj: https://github.com/joyent/node/blob/master/src/node_root_certs.h

Tak w skrócie, bez cert organ przewidziany jako opcja do https.get moduł tls będzie próbował uwierzytelnić połączenie przy użyciu listy certyfikatów root tak czy inaczej.

+1

To dobre informacje dzięki. To mi nie pomoże, ponieważ używam własnego certyfikatu z podpisem własnym. Spodziewam się, że połączenie działa tylko wtedy, gdy przekazuję mój certyfikat, ale działa w dowolny sposób. – justinhj

+0

@ Перо czy istnieje sposób na połączenie certyfikatu serwera i nie zgubienie głównych urzędów certyfikacji? Przykład: ca: [fs.readFileSync ('myServerCert.pem '), node_root_certs.h] 'Jaka byłaby składnia dostępu do stałej w pliku nagłówkowym? – pulkitsinghal

1

W V 0.6.15 trzeba explicitly check czy sprawdzanie poprawności certyfikatu przyjęta czy odrzucona.

if (x.connection.authorized === false) {  
    console.log('SSL Authentication failed'); 
} else if (x.connection.authorized === true) {  
    console.log('SSL Authentication succeeded'); 
} 
+0

To wydaje się obiecujące, ale X.authorized jest niezdefiniowana. – justinhj

+0

@justinhj, poprawiłem kod w odpowiedzi. –

+0

Prawdopodobnie ma to zostać umieszczone w funkcji wywołania zwrotnego. Niestety nie uniemożliwia to wysłania żądania, gdy certyfikat nie jest zaufany, po prostu informuje o tym, kiedy już to zrobi (na przykład można było przesłać poświadczenia uwierzytelniające). – Bruno

2

zrobić to w KMP, przy użyciu modułu request. To idzie tak:

var cacert = ... // in npm, this is a config setting 
var request = require("request") 
request.get({ url: "https://...", 
       ca: cacert, 
       strictSSL: true }) 
    .on("response", function (resp) { ... }) 
    .on("error", function (er) { ... }) 

Impreza błąd zostanie podniesiony, jeśli ssl nie jest ważna.

Powiązane problemy