unable to verify the first certificate
सर्टिफिकेट चेन अधूरी है।
इसका मतलब है कि जिस वेबसर्वर को आप कनेक्ट कर रहे हैं वह गलत है और इसे आपके द्वारा भेजी गई सर्टिफिकेट चेन में इंटरमीडिएट सर्टिफिकेट शामिल नहीं है।
प्रमाणपत्र श्रृंखला
इसकी संभावना इस प्रकार है:
- सर्वर प्रमाणपत्र - मध्यवर्ती द्वारा हस्ताक्षरित प्रमाण पत्र को संग्रहीत करता है।
- इंटरमीडिएट प्रमाणपत्र - रूट द्वारा हस्ताक्षरित प्रमाण पत्र को संग्रहीत करता है।
- रूट प्रमाणपत्र - एक स्व-हस्ताक्षरित प्रमाणपत्र संग्रहीत करता है।
सर्वर सर्टिफिकेट के साथ इंटरमीडिएट सर्टिफिकेट सर्वर पर स्थापित किया जाना चाहिए।
रूट प्रमाणपत्र सॉफ्टवेयर अनुप्रयोगों, ब्राउज़रों और ऑपरेटिंग सिस्टम में एम्बेडेड होते हैं।
प्रमाण पत्र की सेवा करने वाले आवेदन को पूरी श्रृंखला भेजनी होती है, इसका अर्थ है सर्वर प्रमाणपत्र स्वयं और सभी मध्यवर्ती। रूट प्रमाणपत्र को क्लाइंट द्वारा ज्ञात किया जाना चाहिए।
समस्या को फिर से बनाएँ
अपने ब्राउज़र का उपयोग करके https://incomplete-chain.badssl.com पर जाएं ।
यह कोई त्रुटि नहीं दिखाता (एड्रेस बार में पैडलॉक हरा है)।
ऐसा इसलिए है क्योंकि सर्वर से भेजे नहीं जाने पर ब्राउज़र श्रृंखला को पूरा करते हैं ।
अब, नोड का उपयोग करके https://incomplete-chain.badssl.com से कनेक्ट करें :
// 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
,
2 बी: या ca
विकल्प का उपयोग करके अपना स्वयं का प्रमाणपत्र बंडल (इंटरमीडिएट और रूट) पास करें ।
1. मुझे इंटरमीडिएट प्रमाण पत्र कैसे मिलेगा?
उपयोग करना openssl
( विंडोज के लिए गिट के साथ आता है )।
दूरस्थ सर्वर का प्रमाणपत्र विवरण सहेजें:
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"
यह आपको हस्ताक्षरित प्रमाणपत्र का यूआरआई देना चाहिए। डाउनलोड करो:
curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
अंत में, इसे इसमें रूपांतरित करें .pem
:
openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text
2 ए। 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"
2 बी। ca
विकल्प
यह विकल्प नोड के अंतर्निहित रूट CA को अधिलेखित करने वाला है।
इसलिए हमें अपना मूल CA बनाने की आवश्यकता है। Ssl-root-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