2012-06-04 11 views
173

Pracuję nad małą aplikacją, która loguje się do mojego lokalnego routera bezprzewodowego (Linksys), ale mam problem z samopodpisanym certyfikatem ssl routera.Zignorować nieprawidłowy samopodpisany certyfikat ssl w pliku node.js z https.request?

Pobiegłem wget 192.168.1.1, a otrzymasz:

ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/[email protected]': 
Self-signed certificate encountered. 
ERROR: certificate common name `Linksys' doesn't match requested host name `192.168.1.1'. 
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'. 

W węźle, błąd przyłapania jest:

{ [Error: socket hang up] code: 'ECONNRESET' } 

Mój obecny jest przykładowy kod:

var req = https.request({ 
    host: '192.168.1.1', 
    port: 443, 
    path: '/', 
    method: 'GET' 

}, function(res){ 

    var body = []; 
    res.on('data', function(data){ 
     body.push(data); 
    }); 

    res.on('end', function(){ 
     console.log(body.join('')); 
    }); 

}); 
req.end(); 

req.on('error', function(err){ 
    console.log(err); 
}); 

Jak czy mogę uzyskać plik node.js, aby uzyskać odpowiednik "--no-check-certificate"?

Odpowiedz

346

Tani i niepewna odpowiedź:

Dodaj

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 

w kodzie, przed wywołaniem https.request()

bardziej bezpieczny sposób (powyżej rozwiązanie sprawia, że ​​cały proces węzła niezabezpieczone) zostanie odebrane w tym question

+2

Gdzie w kodzie należy go dodać? –

+2

Pracowałam jak urok dla mnie! Umieściłem ten kod zaraz po tym, jak zawarłem wszystko na samym szczycie głównej aplikacji js. – Xedecimal

+0

To również działało dla kombinacji NodeJS i SailJS. Dodałem go na początku pliku local.js –

109

W opcjach żądanie, spróbuj w tym następujące:

var req = https.request({ 
     host: '192.168.1.1', 
     port: 443, 
     path: '/', 
     method: 'GET', 
     rejectUnauthorized: false, 
     requestCert: true, 
     agent: false 
    }, 
+1

Hmm nie działa dla mnie .. – murvinlai

+0

Pracowałem dla mnie. Używam reszta i domyślam się, że domyślnie nie przekazałem opcji, więc musiałem to załatać. –

+10

Dodaj "rejectUnauthorized: false" działa dla mnie – tangxinfa

1

Albo można spróbować dodać lokalnego rozpoznawania nazw (znajdujący się w katalogu etc w większości systemów operacyjnych hosts plik, szczegóły różnią się) coś takiego :

192.168.1.1 Linksys 

i obok

var req = https.request({ 
    host: 'Linksys', 
    port: 443, 
    path: '/', 
    method: 'GET' 
... 

będzie działać.

+3

prawda, że ​​to może odpowiedzieć na pytanie, ale myślę, że następnym błędem będzie DEPTH_ZERO_SELF_SIGNED_CERT w tym przypadku. –

+1

, w jaki sposób można obejść DEPTH_ZERO_SELF_SIGNED_CERT? Biegnę w to teraz. – reza

+3

@reza: dodaj to do twoich opcji: 'rejectUnauthorized: false' – Obay

24

Dodaj następującą zmienną środowiskową:

NODE_TLS_REJECT_UNAUTHORIZED=0 

np. z export:

export NODE_TLS_REJECT_UNAUTHORIZED=0 

(z wielkich dzięki Juanra)

+2

co to znaczy !!! jak rozwiązać problem proszę opracować – user3522412

+0

To działało dla mnie podczas próby uruchomienia 'aktualizacji webdriver-manager' – Ash

+1

zestaw NODE_TLS_REJECT_UNAUTHORIZED = 0 dla Windows –

2

Dla meteorJS można ustawić z npmRequestOptions.

HTTP.post(url, { 
    npmRequestOptions: { 
     rejectUnauthorized: false // TODO remove when deploy 
    }, 
    timeout: 30000, // 30s 
    data: xml 
}, function(error, result) { 
    console.log('error: ' + error); 
    console.log('resultXml: ' + result); 
}); 
4

Dodawanie do @Armand odpowiedź:

Add the following environment variable:

NODE_TLS_REJECT_UNAUTHORIZED=0 e.g. with export:

export NODE_TLS_REJECT_UNAUTHORIZED=0 (with great thanks to Juanra)

Jeśli na wykorzystanie Windows:

set NODE_TLS_REJECT_UNAUTHORIZED=0 

Thanks to: @weagle08

17

nie wierzę wszystkim, którzy próbuje cię zwodzić. w swoim wniosku, wystarczy dodać:

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})] 

Jeśli włączysz nieautoryzowanych certyfikatów, nie będzie można w ogóle chronione (narażony na MiTM za nie potwierdzania tożsamości) i działa bez SSL nie będzie duża różnica . rozwiązaniem jest określenie certyfikatu CA, którego się spodziewasz, jak pokazano w następnym fragmencie. upewnij się, że wspólna nazwa certyfikatu jest identyczny z adresem ty nazwie we wniosku (jak określono w przyjmującym): Co dostaniesz wtedy jest:

var req = https.request({ 
     host: '192.168.1.1', 
     port: 443, 
     path: '/', 
ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})], 
     method: 'GET', 
     rejectUnauthorized: true, 
     requestCert: true, 
     agent: false 
    }, 

Proszę przeczytać this article tutaj, aby zrozumieć :

  • Jak CA Certyfikaty pracować
  • Jak wygenerować certyfikaty urzędu certyfikacji do testowania łatwo w celu symulowania środowiska produkcyjnego
+3

Powinny znajdować się na górze przed innymi niebezpiecznymi obejściami. – protometa

+2

To działa i jest właściwą metodą rozwiązania problemu "Błąd: samopodpisany certyfikat w łańcuchu certyfikatów." – RohanRasane

Powiązane problemy