Saya menggunakan node.js request.js untuk mencapai api. Saya mendapatkan kesalahan ini
[Kesalahan: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
Semua kredensial saya akurat dan valid, dan server baik-baik saja. Saya membuat permintaan yang sama dengan tukang pos.
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);
});
Kode ini hanya berjalan di ex skrip yang dapat dieksekusi. node ./run_file.js
Apakah itu sebabnya? Apakah perlu dijalankan di server?
javascript
node.js
ssl
request
ThomasReggi
sumber
sumber
Jawaban:
Catatan : berikut ini berbahaya, dan akan memungkinkan konten API dicegat dan dimodifikasi antara klien dan server.
Ini juga berhasil
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
sumber
nodemailer
dannodemailer-smtp-transport
dan perintah umum yang sama berhasil. Anda perlu menambahkan ini kecreateTransport
objek Anda :tls:{rejectUnauthorized: false}
Ini bukan masalah dengan aplikasi, tetapi dengan sertifikat yang ditandatangani oleh perantara CA. Jika Anda menerima fakta itu dan masih ingin melanjutkan, tambahkan berikut ini untuk meminta opsi:
Permintaan penuh:
sumber
Solusi Aman
Daripada mematikan keamanan, Anda dapat menambahkan sertifikat yang diperlukan ke rantai. Pertama instal paket ssl-root-cas dari npm:
Paket ini berisi banyak sertifikat perantara yang dipercayai peramban tetapi simpul tidak.
Akan menambah sertifikat yang hilang. Lihat di sini untuk info lebih lanjut:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
Juga, Lihat jawaban berikutnya di bawah ini
sumber
ca
array Anda sendiri . Saya tidak tahu apakah modul http-nya juga akan melihat ke rantai OS. Namun, curl pada OS X tampaknya hanya menggunakan rantai OS dan tidak mengizinkan sertifikat yang ditentukan secara manual.Solusi CoolAJ86 benar dan tidak membahayakan keamanan Anda seperti menonaktifkan semua cek menggunakan
rejectUnauthorized
atauNODE_TLS_REJECT_UNAUTHORIZED
. Namun, Anda mungkin perlu menyuntikkan sertifikat CA tambahan secara eksplisit.Saya mencoba dulu root CA yang disertakan oleh modul ssl-root-cas :
Saya masih berakhir dengan
UNABLE_TO_VERIFY_LEAF_SIGNATURE
kesalahan. Kemudian saya menemukan siapa yang mengeluarkan sertifikat untuk situs web yang saya sambungkan oleh COMODO SSL Analyzer , mengunduh sertifikat dari otoritas itu dan mencoba menambahkan hanya satu itu:Saya berakhir dengan kesalahan lain:
CERT_UNTRUSTED
. Akhirnya, saya menyuntikkan CA root tambahan dan termasuk CA "saya" (tampaknya perantara), yang berfungsi:sumber
.cer
jalankan iniopenssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt
untuk mengonversikannya.crt
sebelumnyaUntuk Buat React App (di mana kesalahan ini terjadi juga dan pertanyaan ini adalah hasil Google # 1), Anda mungkin menggunakan
HTTPS=true npm start
danproxy
(dalampackage.json
) yang pergi ke beberapa HTTPS API yang dengan sendirinya ditandatangani sendiri, saat dalam pengembangan.Jika itu masalahnya, pertimbangkan untuk berubah
proxy
seperti ini:secure
memutuskan apakah proxy WebPack memeriksa rantai sertifikat atau tidak dan menonaktifkan yang memastikan sertifikat yang ditandatangani sendiri API tidak diverifikasi sehingga Anda mendapatkan data Anda.sumber
Mungkin sangat menggoda untuk melakukan
rejectUnauthorized: false
atauprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
tidak melakukannya! Itu membuat Anda terkena serangan tengah.Jawaban lainnya benar karena masalahnya terletak pada kenyataan bahwa sertifikat Anda "ditandatangani oleh perantara CA". Ada solusi mudah untuk ini, yang tidak memerlukan perpustakaan pihak ketiga suka
ssl-root-cas
atau menyuntikkan CA tambahan ke dalam node.Sebagian besar https klien di opsi dukungan simpul yang memungkinkan Anda menentukan CA per permintaan, yang akan diselesaikan
UNABLE_TO_VERIFY_LEAF_SIGNATURE
. Berikut adalah contoh sederhana menggunakanhttps
modul built-int node .Namun, jika Anda dapat mengkonfigurasi pengaturan ssl di server hosting Anda, solusi terbaik adalah menambahkan sertifikat perantara ke penyedia hosting Anda. Dengan begitu pemohon klien tidak perlu menentukan CA, karena itu termasuk dalam server itu sendiri. Saya pribadi menggunakan namecheap + heroku. Triknya bagi saya adalah membuat satu file .crt
cat yourcertificate.crt bundle.ca-bundle > server.crt
. Saya kemudian membuka file ini dan menambahkan baris baru setelah sertifikat pertama. Anda dapat membaca lebih lanjut dihttps://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl
sumber
Hanya menempatkan ini di sini kalau-kalau itu membantu seseorang, kasus saya berbeda dan sedikit campuran yang aneh. Saya mendapatkan ini berdasarkan permintaan yang diakses melalui superagent - masalahnya tidak ada hubungannya dengan sertifikat (yang diatur dengan benar) dan semua harus dilakukan dengan fakta bahwa saya kemudian melewati hasil superagen melalui waterfall callback air terjun modul async . Untuk memperbaikinya: Alih-alih melewati seluruh hasil, cukup lewati
result.body
panggilan balik air terjun.sumber
Saya memiliki masalah yang sama. Saya telah mengikuti solusi @ThomasReggi dan @ CoolAJ86 dan bekerja dengan baik tetapi saya tidak puas dengan solusi tersebut.
Karena masalah "UNABLE_TO_VERIFY_LEAF_SIGNATURE" terjadi karena tingkat konfigurasi sertifikasi.
Saya menerima solusi @ thirdender tetapi merupakan solusi parsial. Sesuai dengan situs web resmi nginx , mereka dengan jelas menyebutkan bahwa sertifikat harus merupakan kombinasi dari Sertifikat server dan sertifikat rantai.
sumber
Anda juga dapat mencoba dengan menyetel strictSSL ke
false
, seperti ini:sumber
Saya memiliki masalah dengan konfigurasi Apache saya setelah menginstal sertifikat GoDaddy pada subdomain. Saya awalnya berpikir itu mungkin masalah dengan Node tidak mengirim Indikator Nama Server (SNI), tapi bukan itu masalahnya. Menganalisis sertifikat SSL subdomain dengan https://www.ssllabs.com/ssltest/ mengembalikan masalah Rantai galat : Tidak lengkap .
Setelah menambahkan
gd_bundle-g2-g1.crt
file yang disediakan GoDaddy melaluiSSLCertificateChainFile
arahan Apache, Node dapat terhubung melalui HTTPS dan kesalahan hilang.sumber
Anda harus memasukkan sertifikat Menengah di server Anda. Ini memecahkan [Kesalahan: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
sumber
Pendekatan lain untuk menyelesaikan masalah ini dengan aman adalah dengan menggunakan modul berikut.
node_extra_ca_certs_mozilla_bundle
Modul ini dapat bekerja tanpa modifikasi kode dengan membuat file PEM yang mencakup semua sertifikat root dan perantara yang dipercaya oleh Mozilla. Anda dapat menggunakan variabel lingkungan berikut (Bekerja dengan Nodejs v7.3 +),
NODE_EXTRA_CA_CERTS
Untuk menghasilkan file PEM untuk digunakan dengan variabel lingkungan di atas. Anda dapat menginstal modul menggunakan:
dan kemudian meluncurkan skrip simpul Anda dengan variabel lingkungan.
Cara lain untuk menggunakan file PEM yang dihasilkan tersedia di:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
CATATAN: Saya adalah penulis modul di atas.
sumber
Jika Anda datang ke utas ini karena Anda menggunakan modul node postgres / pg, ada solusi yang lebih baik daripada pengaturan
NODE_TLS_REJECT_UNAUTHORIZED
ataurejectUnauthorized
, yang akan menyebabkan koneksi tidak aman.Sebagai gantinya, konfigurasikan opsi "ssl" untuk mencocokkan parameter untuk tls.connect :
Saya telah menulis sebuah modul untuk bantuan dengan parsing opsi ini dari variabel lingkungan seperti
PGSSLROOTCERT
,PGSSLCERT
, danPGSSLKEY
:https://github.com/programmarchy/pg-ssl
sumber
Perintah berikut bekerja untuk saya:
Masalahnya adalah Anda mencoba memasang modul dari repositori dengan sertifikat SSL [Secure Sockets Layer] yang buruk atau tidak tepercaya. Setelah Anda membersihkan cache, masalah ini akan teratasi. Anda mungkin perlu mengubahnya menjadi true nanti.
sumber