Https.request ile node.js'de geçersiz kendinden imzalı SSL sertifikası yoksayılsın mı?


309

Yerel kablosuz yönlendiricime (Linksys) giriş yapan küçük bir uygulama üzerinde çalışıyorum, ancak yönlendiricinin kendinden imzalı SSL sertifikasında bir sorunla karşılaşıyorum.

Wget 192.168.1.1'i çalıştırdım ve aldım:

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/emailAddress=support@linksys.com':
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'.

Düğümde, yakalanan hata:

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

Mevcut örnek kodum:

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

Node.js'yi "--no-check-certificate" eşdeğerini nasıl elde edebilirim?

Yanıtlar:


600

Ucuz ve güvensiz cevap:

Ekle

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

kodda, aramadan önce https.request()

Daha güvenli bir yol (yukarıdaki çözüm tüm düğüm sürecini güvensiz hale getirir) bu soruda cevaplanmıştır


2
Benim için bir cazibe gibi çalıştı! Ben her şeyi benim ana uygulama js en üst dahil hemen sonra bu kodu yerleştirilir.
Xedecimal

Bu aynı zamanda NodeJS ve SailJS kombo için de işe yaradı. Bunu local.js'nin üstüne ekledim
Michael Kork.

38
Her türlü güvenlik kontrolünü devre dışı bıraktığından, bunu bir üretim ortamında kullanmayın veya "rejectUnauthorized" kullanmayın.
Jason Walton

3
Kendinden imzalı https düğüm sunucumda mocha kullanarak testler yapmak ve herhangi bir açıklama bloğunun testlerimi geçmesinden hemen önce bunu eklemekte sorun yaşıyordum.
artis3n

Bu muhtemelen sorunu çözmenin en güvenli yolu değildir. Bkz. Stackoverflow.com/questions/20433287/…
Matt Pennington

166

İstek seçeneklerinize aşağıdakileri eklemeyi deneyin:

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

Benim için çalıştı. Restler kullanın ve ben bu yüzden yama vardı varsayılan olarak seçenekleri iletmek görmedim.
Olivier Amblet

2
Bunun çalışması için özel bir Aracı'nın açık bir örneğini sağlamanız gerekir. Options nesnesini oluşturun ve aracıyı ayarlayın: 'options.agent = new https.Agent (options);' O zaman sadece 'https.request (seçenekler)' çağırın
Max

14
Peki, bu benim için sadece rejectUnauthorizedseçenek ve başka bir şey ile çalıştı
mcont

@mcont i onaylamak sadece rejectUnauthorizedyeterince iyi her şey ootb. İçinde vs kod uzantısı kullanma. Daha iyi henüz PEM yapılandırmasına izin, bunu bir sonraki yapacağım ...
escape-llc

61

Sizi yanıltmaya çalışan herkese inanmayın.

İsteğinize şunları ekleyin:

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

Yetkisiz sertifikaları açarsanız, hiçbir şekilde korunmazsınız (kimliği doğrulamamak için MITM'e maruz kalırsınız) ve SSL olmadan çalışmak büyük bir fark olmaz. Çözüm, bir sonraki snippet'te gösterildiği gibi beklediğiniz CA sertifikasını belirtmektir. Sertifikanın ortak adının istekte aradığınız adresle aynı olduğundan emin olun (Ana bilgisayarda belirtildiği gibi):

O zaman ne alacaksınız:

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
    },

Anlamak için lütfen bu makaleyi (açıklama: bu yanıtın yazarı tarafından yazılan blog yazısı) okuyun:

  • CA Sertifikaları nasıl çalışır?
  • Üretim ortamını simüle etmek için kolayca test için CA Sertifikaları nasıl oluşturulur

7
Bu çalışır ve "Hata: sertifika zincirinde kendinden imzalı sertifika."
RohanRasane

1
Neden dizgi olarak saklamak yerine fs.readFileSync'i köşeli parantez içine koydunuz?
Lelo

Lelo: parantez bir diziye dönüştürür. ca: bir dizi sertifika bekler. Bu dosya virgülle ayrılmış bir certs listesi olmalıdır, genellikle insanlar bir PEM dosyasını bir diziye dönüştürmek için bir iç işlev kullanır. Kendinden imzalı bir ağ için tek bir sertifika "gerekir" çalışır.
JohnDavid

53

Aşağıdaki ortam değişkenini ekleyin:

NODE_TLS_REJECT_UNAUTHORIZED=0

örneğin export:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(Juanra'ya çok teşekkürler)


Bu koşmaya çalışırken benim için çalıştıwebdriver-manager update
Ashley

3
windows için NODE_TLS_REJECT_UNAUTHORIZED = 0 olarak ayarla
Felipe SS

Bu, geliştirme
David

14

@Armand yanıtına ekleniyor:

Aşağıdaki ortam değişkenini ekleyin:

NODE_TLS_REJECT_UNAUTHORIZED = 0 örneğin dışa aktarma ile:

dışa aktar NODE_TLS_REJECT_UNAUTHORIZED = 0 (Juanra'ya çok teşekkürler)

Windows kullanımındaysanız:

set NODE_TLS_REJECT_UNAUTHORIZED=0

Teşekkürler: @ weagle08


12

Varsayılan seçeneklerle bir istek örneği de oluşturabilirsiniz:

require('request').defaults({ rejectUnauthorized: false })

3

MeteorJS için npmRequestOptions ile ayarlayabilirsiniz.

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

1

Veya yerel ad çözümlemesini ( çoğu işletim sisteminde hostsdizinde etcbulunan dosya , ayrıntılar farklıdır) eklemeyi deneyebilirsiniz :

192.168.1.1 Linksys 

ve sonra

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

çalışacak.


3
Bu soruya cevap olabilir ama bir sonraki hatanın bu durumda DEPTH_ZERO_SELF_SIGNED_CERT olacağını düşünüyorum.
Olivier Amblet

1
Peki DEPTH_ZERO_SELF_SIGNED_CERT nasıl dolaşır? Şimdi bununla karşılaşıyorum.
reza

3
@reza: Bunu seçeneklerinize ekleyin:rejectUnauthorized: false
Mart'ta Obay'ı

1
Bunun biraz eski olduğunu biliyorum ama gelecekteki referans için (bunu doğru şekilde yapmak için), kendinden imzalı sertifikanın PEM kodlamasını almanız ve bir CA olarak seçeneklere eklemeniz gerekir (görünüşe göre aracı değerini ayarlamak için bu yanlış olabilir). Sertifika kendinden imzalı olduğu için kendi CA'sı olarak çalışır ve bu nedenle kendini doğrulamak için kullanılabilir. Ancak, bellenim muhtemelen indirilebileceği ve bu nedenle özel anahtarın kolayca ele geçirilebileceği için gerçekten bir yönlendiricide yapmaya değip değmeyeceğini de soruyorum.
Jonathan Gray
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.