Saya mencoba mengunduh file dari server jira menggunakan url tapi saya mendapat kesalahan. cara memasukkan sertifikat ke dalam kode untuk memverifikasi Kesalahan:
Error: unable to verify the first certificate in nodejs
at Error (native)
at TLSSocket.<anonymous> (_tls_wrap.js:929:36)
at TLSSocket.emit (events.js:104:17)
at TLSSocket._finishInit (_tls_wrap.js:460:8)
Kode Nodejs saya:
var https = require("https");
var fs = require('fs');
var options = {
host: 'jira.example.com',
path: '/secure/attachment/206906/update.xlsx'
};
https.get(options, function (http_res) {
var data = "";
http_res.on("data", function (chunk) {
data += chunk;
});
http_res.on("end", function () {
var file = fs.createWriteStream("file.xlsx");
data.pipe(file);
});
});
node.js
ssl-certificate
jira
Labeo
sumber
sumber
Jawaban:
Coba tambahkan sertifikat root yang sesuai
Ini akan selalu menjadi pilihan yang jauh lebih aman daripada hanya menerima secara buta poin akhir yang tidak sah, yang pada gilirannya hanya akan digunakan sebagai upaya terakhir.
Ini bisa sesederhana menambahkan
ke aplikasi Anda.
The SSL Akar CA paket NPM (seperti yang digunakan di sini) adalah paket yang sangat berguna mengenai masalah ini.
sumber
$(mkcert -CAROOT)/rootCA.pem
dalam file sertifikat baru dan melakukan sesuatu sepertihttps.globalAgent.options.ca = fs.readFileSync('fullchain.pem')
Lihat github.com/FiloSottile/mkcert/issues/76ssl-root-cas
modul npm memiliki permintaan ke mozilla.org hardcoded git.coolaj86.com/coolaj86/ssl-root-cas.js/src/branch/master/… . Mungkin aman karena Mozilla tetapi sepertinya vektor serangan.Peretasan kotor lainnya, yang akan membuat semua permintaan Anda tidak aman:
sumber
diperlukan untuk tidak dapat memverifikasi sertifikat pertama di nodejs menolak diperlukan tidak sah
sumber
Server yang Anda coba unduh mungkin terkonfigurasi dengan buruk. Bahkan jika itu bekerja di browser Anda, itu mungkin tidak termasuk semua sertifikat publik dalam rantai yang diperlukan untuk klien yang mengosongkan cache untuk memverifikasi.
Saya sarankan memeriksa situs di alat SSLlabs: https://www.ssllabs.com/ssltest/
Cari kesalahan ini:
Dan ini:
sumber
cat domainname.crt domainname.ca-bundle > domainname-ssl-bundle.crt
unable to verify the first certificate
Rantai sertifikat tidak lengkap.
Ini berarti bahwa server web yang Anda sambungkan salah konfigurasi dan tidak menyertakan sertifikat perantara dalam rantai sertifikat yang dikirimkan kepada Anda.
Rantai sertifikat
Kemungkinan besar terlihat sebagai berikut:
Sertifikat perantara harus dipasang di server, bersama dengan sertifikat server.
Sertifikat root disematkan ke aplikasi perangkat lunak, browser, dan sistem operasi.
Aplikasi yang melayani sertifikat harus mengirim rantai lengkap, ini berarti sertifikat server itu sendiri dan semua perantara. Sertifikat root seharusnya diketahui oleh klien.
Buat kembali masalahnya
Pergi ke https://incomplete-chain.badssl.com menggunakan browser Anda.
Itu tidak menunjukkan kesalahan apa pun (gembok di bilah alamat berwarna hijau).
Itu karena browser cenderung menyelesaikan rantai jika tidak dikirim dari server.
Sekarang, terhubung ke https://incomplete-chain.badssl.com menggunakan Node:
Log: " Kesalahan: tidak dapat memverifikasi sertifikat pertama ".
Larutan
Anda harus menyelesaikan sendiri rantai sertifikat.
Untuk melakukannya:
1: Anda harus mendapatkan sertifikat perantara yang hilang dalam
.pem
format2a: memperpanjang toko sertifikat built-in Node menggunakan
NODE_EXTRA_CA_CERTS
,2b: atau lulus bundel sertifikat Anda sendiri (perantara dan root) menggunakan
ca
opsi.1. Bagaimana cara saya mendapatkan sertifikat perantara?
Menggunakan
openssl
(dilengkapi dengan Git untuk Windows ).Simpan detail sertifikat server jarak jauh:
Kami sedang mencari penerbit (sertifikat perantara adalah penerbit / penandatangan sertifikat server):
Itu harus memberi Anda URI sertifikat penandatanganan. Unduh itu:
Akhirnya, ubah menjadi
.pem
:2a. NODE_EXTRA_CERTS
Saya menggunakan cross-env untuk mengatur variabel lingkungan dalam
package.json
file:2b.
ca
pilihanOpsi ini akan menimpa CA root bawaan Node.
Itu sebabnya kita perlu membuat root CA kita sendiri. Gunakan ssl-root-cas .
Lalu, buat
https
agen khusus yang dikonfigurasi dengan bundel sertifikat kami (root dan perantara). Lewati agen iniaxios
ketika mengajukan permintaan.Alih-alih membuat
https
agen khusus dan meneruskannyaaxios
, Anda dapat menempatkan sertifikat padahttps
agen global:Sumber:
sumber
Ini sebenarnya memecahkannya untuk saya, dari https://www.npmjs.com/package/ssl-root-cas
sumber
Anda mungkin dapat melakukan ini dengan mengubah opsi permintaan seperti di bawah ini. Jika Anda menggunakan sertifikat yang ditandatangani sendiri atau perantara yang hilang, menetapkan strictSSL ke false tidak akan memaksa paket permintaan untuk memvalidasi sertifikat.
sumber
GoDaddy SSL CCertificate
Saya pernah mengalami ini ketika mencoba terhubung ke server API backend kami dengan sertifikat GoDaddy dan di sini adalah kode yang saya gunakan untuk menyelesaikan masalah.
PS:
Gunakan sertifikat yang dibundel dan jangan lupa untuk menginstal perpustakaan
npm install ssl-root-cas
sumber
Ini Berfungsi Bagi Saya => menambahkan agen dan 'rejectUnauthorized' disetel ke false
sumber
Pendekatan lain untuk menyelesaikan ini 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
Saya menggunakan modul NPM nodemailer. Kode di bawah ini menyelesaikan masalah
sumber