Yaprak imzası doğrulanamıyor


142

Bir API'ye ulaşmak için node.js request.js kullanıyorum. Bu hatayı alıyorum

[Hata: UNABLE_TO_VERIFY_LEAF_SIGNATURE]

Tüm kimlik bilgilerim doğru ve geçerli ve sunucunun para cezası. Postacı için de aynı isteği yaptım.

request({
    "url": domain+"/api/orders/originator/"+id,
    "method": "GET",
    "headers":{
        "X-API-VERSION": 1,
        "X-API-KEY": key
    },
}, function(err, response, body){
    console.log(err);
    console.log(response);
    console.log(body);
});

Bu kod sadece ex yürütülebilir bir komut dosyasında çalışıyor. node ./run_file.js, Bu yüzden mi? Bir sunucuda çalışması gerekiyor mu?


Bu uzun bir çekimdir, ancak API düğüm programınız tarafından iletilen kullanıcı aracısını tanımıyor olabilir mi?
Hector Correa


@HectorCorrea Postacıdaki API'yi mükemmel bir şekilde okuyabildim. Düğüm neden yapamıyor? Kullanıcı aracısını değiştirmeyi denedim, şans yok.
ThomasReggi

Yanıtlar:


157

Not : aşağıdakiler tehlikelidir ve API içeriğinin istemci ve sunucu arasında ele geçirilmesine ve değiştirilmesine izin verecektir.

Bu da işe yaradı

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';


22
Bunu değiştirdim ve cevap verdiğiniz için teşekkürler, ancak güvenliğiniz için aktif olarak zararlıdır. @ CoolAJ86'nın cevabına aşağıdaki eksik CA'yı eklemelisiniz.
mikemaccana

4
Ben NodeJS denilen eklentisi kullanıyorum nodemailerve nodemailer-smtp-transportve aynı genel komut çalıştı. Bunu createTransportnesnenize eklemeniz gerekir :tls:{rejectUnauthorized: false}
LukeP

3
@LukeP sanırım nodemailer ile eşit derecede güvensiz. Adına bir ipucu var: Bir öğenin eğer Un yetkili, genellikle tanımı gereği, reddetme istiyorum. İhtiyacınız olan şey, doğru bir şekilde yetkilendirmenin bir yolunu bulmaktır (CA sertifikalarını doğru şekilde ayarlayarak, diğer yanıtların daha önce söylediği gibi).
Bruno

@Bruno Kabul ediyorum, sertifikalarla doğru şekilde ayarlamanız gerekir. Ben sadece bir demo için hızlı bir test kurmak istedim, bu yüzden ben yayınlanan kod hızlı bir düzeltme. Yorumumda bunu önceden yapmalıydım.
LukeP

1
@mikemaccana İstek aynı sunucuda ise ve tek sahibi sizseniz güvenlik sorunu yoktur.
Binar Web

89

Bu uygulama ile değil, bir aracı CA tarafından imzalanan sertifika ile ilgili bir sorundur. Bu gerçeği kabul ediyorsanız ve devam etmek istiyorsanız, seçenekleri istemek için aşağıdakileri ekleyin:

rejectUnauthorized: false

Tam istek:

request({
    "rejectUnauthorized": false,
    "url": domain+"/api/orders/originator/"+id,
    "method": "GET",
    "headers":{
        "X-API-VERSION": 1,
        "X-API-KEY": key
    },
}, function(err, response, body){
    console.log(err);
    console.log(response);
    console.log(body);
});

Şu anda işte bu sorun var. SSL'nin yanlış yapılandırılabileceğini söyleyen bir BT bileti gönderdim - bana çılgın olduğumu söylediler. Bu sorunu çözmek için onlara verebileceğim daha fazla bilgi var mı?
blakev

Bu aslında doğru değil: CoolAJ86 ve hectorcorrea'nın da belirttiği gibi, sertifika geçerli, ancak bir aracı CA tarafından imzalandı.
mikemaccana

80

Güvenli Çözüm

Güvenliği kapatmak yerine, zincire gerekli sertifikaları ekleyebilirsiniz. Önce npm'den ssl-root-cas paketini kurun:

npm install ssl-root-cas

Bu paket, tarayıcıların güvendiği ancak düğümü kullanmayan birçok aracı sertifika içerir.

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()

Eksik sertifikaları ekleyecek. Daha fazla bilgi için buraya bakın:

https://git.coolaj86.com/coolaj86/ssl-root-cas.js

Ayrıca, aşağıdaki sonraki cevaba bakınız


2
Http istemcisi Windows Güvenilir Kök Sertifika Yetkilileri sertifika deposunu kullanmıyor mu?
Richard Collette

1
Düğüm, ikili dosyada paketlenmiş mozilla sertifikalarını kullanır ve kendi cadizinizi sağladığınızda bunları geçersiz kılar . Http modülünün OS zincirine de bakıp bakmayacağını bilmiyorum. Bununla birlikte, OS X'te kıvrılma sadece OS zincirini kullanıyor ve manuel olarak belirtilen sertifikalara izin vermiyor gibi görünüyor.
coolaj86

Bunun her işlem için çalıştırılması gerekiyor mu yoksa bir kez çalıştırıp sertifikalarımı global olarak güncelleyebilir miyim?
Joshua Snider

Sertifikalar potansiyel olarak iki yerde saklanır: (1) node.js ikili dosyasında yerleşik (2) işletim sistemi anahtar deposu. Sertifikalarınız güncel değilse, çalışan kodunuza eklemeniz gerekir. Düğüm ikilisini veya işletim sisteminizi değiştirmez - sadece proje klasörünü değiştirir.
coolaj86

1
@Sunkas Hata mesajlarının söylediği tam olarak budur. Daha basit bir şekilde nasıl açıklayacağımı bilmiyorum. Bu salt okunur bir dosyadır ve düzenlenemez.
coolaj86

45

CoolAJ86'nın çözümü doğrudur ve rejectUnauthorizedveya kullanarak tüm kontrolleri devre dışı bırakmak gibi güvenliğinizden ödün vermez.NODE_TLS_REJECT_UNAUTHORIZED . Yine de, açıkça bir CA sertifikası daha enjekte etmeniz gerekebilir.

Önce ssl-root-cas modülü dahil kök CA'lar denedim :

require('ssl-root-cas/latest')
  .inject();

Hala UNABLE_TO_VERIFY_LEAF_SIGNATUREhatayla sonuçlandım . Daha sonra COMODO SSL Analyzer tarafından bağlandığım web sitesi için sertifikayı kimin verdiğini öğrendim , bu yetkilinin sertifikasını indirdim ve yalnızca bu sertifikayı eklemeye çalıştım:

require('ssl-root-cas/latest')
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');

Başka bir hata ile sona erdi: CERT_UNTRUSTED. Son olarak, ek kök CA'ları enjekte ettim ve işe yarayan "my" (görünüşte arabulucu) CA'yı dahil ettim:

require('ssl-root-cas/latest')
  .inject()
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');

1
COMODO High-Assurance Secure Server CA tarafından verilen sertifikalı bir web sitesine bağlanıyordum. Sertifikayı indirme sayfalarından indirdim .
Ferdinand Prantl

2
Teşekkür ederim! Benim sorunum için bu hatayı aşmak için tüm certs zincirini eklemek gerekiyordu. Diğerleri referans için, bu yazı bana gerekli pem dosyalarını Firefox üzerinden nasıl dışa
aktaracağımı gösterdi

Yardımın için teşekkürler. Benim durumumda, sonunda düğüm değil, SSL sunucusunun kötü bir yapılandırmasıydı. Ara sertifikaların tümü sunucuya yüklenmedi.
Scott Jungwirth

Eğer önceden ta dönüştürmek için .cerbu bir çalışma olarak sertifika openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt.crt
alırsanız

8

İçin Oluştur App tepki (bu hata çok olur ve bu soru 1. Google sonuç olduğu), muhtemelen kullandığınız HTTPS=true npm startve bir proxy(içinde package.json) gelişiminde bazı HTTPS API kendi imzasını olan kendisi ne zaman gider hangi.

Bu durumda, şu şekilde değiştirmeyi düşünün proxy:

"proxy": {
  "/api": {
    "target": "https://localhost:5001",
    "secure": false
  }
}

secure WebPack proxy'sinin sertifika zincirini kontrol edip etmediğine karar verir ve API kendinden imzalı sertifikanın doğrulanmamasını sağlayan devre dışı bırakıldığında verilerinizi alırsınız.


4

Yapmak çok cazip olabilir rejectUnauthorized: falseya da process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';yapma! Orta saldırılarda sizi adama maruz bırakır.

Diğer cevaplar, sorunun, sertifikanızın "bir aracı CA tarafından imzalanmış olması" gerçeğinde yatması nedeniyle doğrudur. Buna kolay bir çözüm var, bu ssl-root-casda herhangi bir ek CA'yı düğüme enjekte etmek veya enjekte etmek gibi bir üçüncü taraf kütüphanesi gerektirmiyor .

Düğümdeki çoğu https istemcisi, istek başına bir CA belirtmenize olanak tanıyan ve çözülecek seçenekleri destekler UNABLE_TO_VERIFY_LEAF_SIGNATURE. Düğümün yerleşik httpsmodülünü kullanan basit bir örnek .

import https from 'https';

const options = {
  host: '<your host>',
  defaultPort: 443,
  path: '<your path>',
  // assuming the bundle file is co-located with this file
  ca: readFileSync(__dirname + '/<your bundle file>.ca-bundle'),
  headers: {
    'content-type': 'application/json',
  }
};
https.get(options, res => {
  // do whatever you need to do
})

Ancak, barındırma sunucunuzda ssl ayarlarını yapılandırabilirseniz, ara sertifikaları barındırma sağlayıcınıza eklemek en iyi çözüm olacaktır. Bu şekilde, istemcinin sunucunun içinde bulunduğu için bir CA belirtmesi gerekmez. Şahsen namecheap + heroku kullanıyorum. Benim için hile ile bir .crt dosyası oluşturmak oldu cat yourcertificate.crt bundle.ca-bundle > server.crt. Daha sonra bu dosyayı açtım ve ilk sertifikadan sonra bir satırsonu ekledim. Daha fazla bilgi için:

https://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl


Bu hata çoğunlukla üretimde değil, yerel ortamda gelir. Bu nedenle, yerelde iseniz yapması gereken iyi: process.env ['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
Vivex

@Vivex - tüm mesele SSL sertifikalarınızın nasıl çalıştığını ve nasıl geçtiklerini test etmekse, yerel bir ortamda yapmak uygun değildir ...
dwanderson

3

Ayrıca , solidSSL öğesini şu şekilde ayarlayarak da deneyebilirsiniz false:

{  
   url: "https://...",
   method: "POST",
   headers: {
        "Content-Type": "application/json"},
   strictSSL: false
}

Bu Node JS uygulamasından gönderme, harika çalışıyor!
Ally Makongo

Teşekkür ederim!!! Vay canına, çok zaman geçirdikten sonra çalışıyor ...
Nan balığı

2

Bunu birisine yardım etmesi için buraya koymak, benim durumum farklı ve biraz garip bir karışımdı. Ben superagent üzerinden erişilen bir istek üzerine alıyordum - sorunun sertifikaları (ki bu düzgün kurulum) ile ilgisi yoktu ve tüm ben daha sonra async modülünün şelale geri arama yoluyla superagent sonucu geçiyordu gerçeği ile ilgisi vardı . Düzeltmek için: Tüm sonucu geçmek yerine result.body, şelalenin geri aramasından geçmeniz yeterlidir.


2

Aynı sorunları yaşadım. @ThomasReggi ve @ CoolAJ86 çözümünü takip ettim ve iyi çalıştım ancak çözümden memnun değilim.

Çünkü sertifika yapılandırma düzeyi nedeniyle "UNABLE_TO_VERIFY_LEAF_SIGNATURE" sorunu oluştu.

Ben @thirdender çözüm ancak başına düşen kısmi solution.As kabul nginx resmi web sitesi, açıkça belirtilen sertifika sunucusu belgesi ve zincirleme sertifikaların kombinasyonu olmalıdır.

resim açıklamasını buraya girin


0

Bir alt etki alanına bir GoDaddy sertifikası yükledikten sonra Apache yapılandırmamla ilgili bir sorun yaşadım. Başlangıçta Düğümün Sunucu Adı Göstergesi (SNI) göndermemesi ile ilgili bir sorun olabileceğini düşündüm, ancak durum böyle değildi. İle alt alan SSL sertifikasını Analizi https://www.ssllabs.com/ssltest/ hata döndürdü Zincir sorunları: Eksik .

GoDaddy tarafından sağlanan gd_bundle-g2-g1.crtdosyayı SSLCertificateChainFileApache yönergesi ile ekledikten sonra , Düğüm HTTPS üzerinden bağlanabildi ve hata ortadan kalktı.


0

Ara sertifikayı sunucunuza eklemeniz gerekir. Bu, [Hata: UNABLE_TO_VERIFY_LEAF_SIGNATURE] sorununu çözer


0

Bunu güvenli bir şekilde çözmek için başka bir yaklaşım aşağıdaki modülü kullanmaktır.

node_extra_ca_certs_mozilla_bundle

Bu modül, Mozilla tarafından güvenilen tüm kök ve ara sertifikaları içeren bir PEM dosyası oluşturarak herhangi bir kod değişikliği yapılmadan çalışabilir. Aşağıdaki ortam değişkenini kullanabilirsiniz (Nodejs v7.3 + ile çalışır),

NODE_EXTRA_CA_CERTS

Yukarıdaki ortam değişkeniyle kullanılacak PEM dosyasını oluşturmak için. Modülü aşağıdakileri kullanarak kurabilirsiniz:

npm install --save node_extra_ca_certs_mozilla_bundle

ve ardından düğüm komut dosyanızı bir ortam değişkeniyle başlatın.

NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem node your_script.js

Oluşturulan PEM dosyasını kullanmanın diğer yolları:

https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle

NOT: Ben yukarıdaki modülün yazarıyım.


0

Düğüm postgres / pg modülünü kullandığınız için bu iş parçacığına gelirseniz, ayardan NODE_TLS_REJECT_UNAUTHORIZEDveya rejectUnauthorizedgüvenli olmayan bağlantılara yol açacak daha iyi bir çözüm vardır .

Bunun yerine, "ssl" seçeneğini tls.connect parametrelerine uyacak şekilde yapılandırın :

{
  ca: fs.readFileSync('/path/to/server-ca.pem').toString(),
  cert: fs.readFileSync('/path/to/client-cert.pem').toString(),
  key: fs.readFileSync('/path/to/client-key.pem').toString(),
  servername: 'my-server-name' // e.g. my-project-id/my-sql-instance-id for Google SQL
}

Ben gibi ortam değişkenleri gelen bu seçenekleri ayrıştırma ile çok yardımcı olacak bir modül yazdım PGSSLROOTCERT, PGSSLCERTve PGSSLKEY:

https://github.com/programmarchy/pg-ssl


-1

Aşağıdaki komutlar benim için çalıştı:

> npm config set strict-ssl false
> npm cache clean --force

Sorun, hatalı veya güvenilmeyen SSL [Güvenli Yuva Katmanı] sertifikasına sahip bir depodan bir modül yüklemeye çalışmanızdır. Önbelleği temizledikten sonra bu sorun çözülecektir. Daha sonra düzeltmeniz gerekebilir.

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.