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 server - menyimpan sertifikat yang ditandatangani oleh perantara.
- Sertifikat perantara - menyimpan sertifikat yang ditandatangani oleh root.
- Sertifikat root - menyimpan sertifikat yang ditandatangani sendiri.
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:
// index.js
const axios = require('axios');
axios.get('https://incomplete-chain.badssl.com')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
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
format
2a: 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:
openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile
Kami sedang mencari penerbit (sertifikat perantara adalah penerbit / penandatangan sertifikat server):
openssl x509 -in logcertfile -noout -text | grep -i "issuer"
Itu harus memberi Anda URI sertifikat penandatanganan. Unduh itu:
curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
Akhirnya, ubah menjadi .pem
:
openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text
2a. NODE_EXTRA_CERTS
Saya menggunakan cross-env untuk mengatur variabel lingkungan dalam package.json
file:
"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"
2b. ca
pilihan
Opsi 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 ini axios
ketika mengajukan permintaan.
// index.js
const axios = require('axios');
const path = require('path');
const https = require('https');
const rootCas = require('ssl-root-cas').create();
rootCas.addFile(path.resolve(__dirname, 'intermediate.pem'));
const httpsAgent = new https.Agent({ca: rootCas});
axios.get('https://incomplete-chain.badssl.com', { httpsAgent })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Alih-alih membuat https
agen khusus dan meneruskannya axios
, Anda dapat menempatkan sertifikat pada https
agen global:
// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;
Sumber:
- https://levelup.gitconnected.com/how-to-resolve-certificate-errors-in-nodejs-app-involving-ssl-calls-781ce48daded
- https://www.npmjs.com/package/ssl-root-cas
- https://github.com/nodejs/node/issues/16336
- https://www.namecheap.com/support/knowledgebase/article.aspx/9605/69/how-to-check-ca-chain-installation
- /superuser/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file/
- Cara mengonversi .crt ke .pem