unable to verify the first certificate
ห่วงโซ่ใบรับรองไม่สมบูรณ์
หมายความว่าเว็บเซิร์ฟเวอร์ที่คุณเชื่อมต่อมีการกำหนดค่าไม่ถูกต้องและไม่ได้รวมใบรับรองระดับกลางในสายการรับรองที่ส่งถึงคุณ
ห่วงโซ่ใบรับรอง
มีแนวโน้มมากที่สุดดังนี้:
- ใบรับรองเซิร์ฟเวอร์ - จัดเก็บใบรับรองที่ลงนามโดยตัวกลาง
- ใบรับรองระดับกลาง - จัดเก็บใบรับรองที่ลงนามโดยรูท
- ใบรับรองหลัก - จัดเก็บใบรับรองที่ลงนามด้วยตนเอง
ควรติดตั้งใบรับรองระดับกลางบนเซิร์ฟเวอร์พร้อมกับใบรับรองเซิร์ฟเวอร์
ใบรับรองหลักถูกฝังลงในแอปพลิเคชันซอฟต์แวร์เบราว์เซอร์และระบบปฏิบัติการ
แอปพลิเคชันที่ให้บริการใบรับรองจะต้องส่งห่วงโซ่ที่สมบูรณ์ซึ่งหมายถึงใบรับรองเซิร์ฟเวอร์เองและตัวกลางทั้งหมด ใบรับรองหลักควรเป็นที่รู้จักของลูกค้า
สร้างปัญหาใหม่
ไปที่https://incomplete-chain.badssl.comโดยใช้เบราว์เซอร์ของคุณ
ไม่แสดงข้อผิดพลาดใด ๆ (แม่กุญแจในแถบที่อยู่เป็นสีเขียว)
เป็นเพราะเบราว์เซอร์มีแนวโน้มที่จะดำเนินการให้เสร็จสมบูรณ์หากไม่ได้ส่งจากเซิร์ฟเวอร์
ตอนนี้เชื่อมต่อกับhttps://incomplete-chain.badssl.comโดยใช้ 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);
});
บันทึก: " ข้อผิดพลาด: ไม่สามารถตรวจสอบใบรับรองแรกได้ "
สารละลาย
คุณต้องกรอกห่วงโซ่ใบรับรองด้วยตัวเอง
ในการทำเช่นนั้น:
1:คุณต้องได้รับใบรับรองกลางที่ขาดหายไปใน.pem
รูปแบบจากนั้น
2a:ขยายโหนดของในตัวเก็บใบรับรองใช้NODE_EXTRA_CA_CERTS
,
2b:หรือส่งชุดใบรับรองของคุณเอง (ตัวกลางและรูท) โดยใช้ca
ตัวเลือก
1. ฉันจะได้รับใบรับรองระดับกลางได้อย่างไร?
ใช้openssl
(มาพร้อมกับGit สำหรับ Windows )
บันทึกรายละเอียดใบรับรองของเซิร์ฟเวอร์ระยะไกล:
openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile
เรากำลังมองหาผู้ออก (ใบรับรองระดับกลางคือผู้ออก / ผู้ลงนามใบรับรองเซิร์ฟเวอร์):
openssl x509 -in logcertfile -noout -text | grep -i "issuer"
ควรให้ URI ของใบรับรองการลงนาม ดาวน์โหลดได้:
curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
สุดท้ายแปลงเป็น.pem
:
openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text
2a NODE_EXTRA_CERTS
ฉันใช้cross-envเพื่อตั้งค่าตัวแปรสภาพแวดล้อมในpackage.json
ไฟล์:
"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"
2b ca
ตัวเลือก
ตัวเลือกนี้จะเขียนทับ CA รากในตัวของ Node
นั่นเป็นเหตุผลที่เราต้องสร้าง root CA ของเราเอง ใช้SSL ราก CAS
จากนั้นสร้างhttps
เอเจนต์แบบกำหนดเองที่กำหนดค่าด้วยชุดใบรับรองของเรา (รูทและระดับกลาง) ส่งตัวแทนนี้ไปaxios
เมื่อทำการร้องขอ
// 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);
});
แทนที่จะสร้างhttps
ตัวแทนที่กำหนดเองและส่งต่อไปยังaxios
คุณสามารถวางใบรับรองบนhttps
ตัวแทนส่วนกลาง:
// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;
แหล่งข้อมูล:
- 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/
- วิธีแปลง. crt เป็น. pem