त्रुटि: नोडज में पहले प्रमाण पत्र को सत्यापित करने में असमर्थ


141

मैं एक यूआरएल का उपयोग करके एक सर्वर से एक फ़ाइल डाउनलोड करने की कोशिश कर रहा हूं, लेकिन मुझे एक त्रुटि मिल रही है। त्रुटि को सत्यापित करने के लिए कोड में प्रमाणपत्र कैसे शामिल करें :

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)

मेरा कोड कोड:

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);

    });
});

क्या आप इसे हल करने में सक्षम थे?
शरद जैन

1
मैंने प्रमाणपत्र सत्यापन को अक्षम करने और किए जाने जैसी एक और प्रक्रिया का उपयोग किया
Labeo

क्या आप थोड़ा और विस्तृत कर सकते हैं? यह वास्तव में मेरे लिए उपयोगी होगा
शरद जैन

प्रमाण पत्र के सत्यापन के लिए नीचे दिए गए उत्तर को देखें, हमें अस्वीकार करना होगा
Labeo

जवाबों:


120

उपयुक्त रूट प्रमाणपत्र जोड़ने का प्रयास करें

यह हमेशा अनधिकृत अंत बिंदुओं को आँख बंद करके स्वीकार करने की तुलना में अधिक सुरक्षित विकल्प होने जा रहा है, जिसे केवल अंतिम उपाय के रूप में उपयोग किया जाना चाहिए।

यह जोड़ने के रूप में सरल हो सकता है

require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();

आपके आवेदन के लिए।

एसएसएल रूट सीए NPM पैकेज (के रूप में यहां इस्तेमाल किया) इस समस्या के बारे में एक बहुत ही उपयोगी पैकेज है।


9
यह जवाब ज्यादातर मामलों में इस्तेमाल किया जाना चाहिए क्योंकि यह एसएसएल के संपूर्ण लाभ को निष्क्रिय करने के बजाय वास्तव में समस्या को ठीक करता है।
मिकमेकाना

12
जैसा कि ssl-root-cas मॉड्यूल README में कहा गया है, इस मुद्दे के लिए सबसे आम कारणों में से एक यह है कि आपका प्रमाणपत्र अपने मध्यवर्ती CA प्रमाणपत्रों को एम्बेड नहीं करता है। कुछ और प्रयास करने से पहले अपने प्रमाण पत्र को ठीक करने का प्रयास करें;)
लॉरेंट वीबी

आपको SSL-root-cas पैकेज की आवश्यकता भी नहीं हो सकती है। बस एक फुलचैन प्रमाणपत्र के लिए GlobalAgents.option.cert सेट करें। यही मेरी समस्या का हल है।
smartexpert

1
mccert "फुलचैन" प्रमाणपत्र नहीं बनाता है। आपको $(mkcert -CAROOT)/rootCA.pemएक नई प्रमाणपत्र फ़ाइल में उपलब्ध रूट प्रमाणपत्र के साथ अपने प्रमाणपत्र को संक्षिप्त करना होगा और कुछ ऐसा करना होगा जैसे https.globalAgent.options.ca = fs.readFileSync('fullchain.pem')देखें github.com/FiloSottile/mkcert/issues/76
फ्रॉस्टी जेड

सुरक्षा दिमाग के लिए, ssl-root-casnpm मॉड्यूल में mozilla.org hardcoded git.coolaj86.com/coolaj86/ssl-root-cas.js/src/branch/master/… का अनुरोध है । यह शायद सुरक्षित है क्योंकि मोज़िला लेकिन यह एक हमले वेक्टर की तरह लगता है।
अविंद्र गोलचरन

60

एक और गंदा हैक, जो आपके सभी अनुरोधों को असुरक्षित बना देगा:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0

8
यह ऊपर दिए गए लैबियो के जवाब से अलग नहीं है , जितना खतरनाक है।
ओकरामॉट

4
यह अलग है, इसे किसी भी कोडिंग परिवर्तन की आवश्यकता नहीं है क्योंकि स्रोत चर के बाहर env चर सेट किया जा सकता है।
jzacharuk

1
यह उत्तर खतरनाक है। आप किसी भी सुरक्षा को अक्षम कर रहे हैं जो टीएलएस प्रदान करता है।
फ्लिम्स

1
यह मेरे लिए, सुपर मददगार काम किया। मेरे मामले में, मैं सिर्फ लोकलहोस्ट से बात कर रहा हूं , इसलिए सुरक्षा समस्या नहीं है।
माइक एस

ललित वास्तव में सिर्फ लोकलहोस्ट का परीक्षण करने के लिए। बस यह सुनिश्चित करें कि आप अपने परीक्षणों के बाद इसे हटा दें।
निको

44

नोडज में पहले प्रमाण पत्र को सत्यापित करने में असमर्थ होने के लिए अनधिकृत को अस्वीकार करने की आवश्यकता है

 request({method: "GET", 
        "rejectUnauthorized": false, 
        "url": url,
        "headers" : {"Content-Type": "application/json",
        function(err,data,body) {
    }).pipe(
       fs.createWriteStream('file.html'));

129
यह उत्तर खतरनाक है। अन्य एक सुरक्षित है।
मिकमेकाना

3
वैसे ऐसा करने से, आप एसएसएल द्वारा प्रदान की गई सुरक्षा को हटा देते हैं, इसलिए इसका उपयोग केवल विकास के लिए किया जाना चाहिए।
सिल्वेन

11
प्रमाणपत्रों की जाँच न करने का अर्थ है कि आप दूसरे पक्ष की पहचान के बारे में निश्चित नहीं हो सकते हैं और इसलिए यह एक स्पूफ होस्ट के अधीन हो सकता है। यहां तक ​​कि अगर आप प्रमाण पत्र की जांच नहीं करते हैं, तो भी, आपको अभी भी एन्क्रिप्टेड संचार मिलता है जो आसानी से नहीं किया जा सकता है। इसलिए इस लाइन को जोड़ने से एसएसएल का "सुरक्षा को हटा नहीं" है, न ही जैसा कि एक अन्य टिप्पणीकार ने कहा था "एसएसएल के पूरे लाभ को निष्क्रिय कर दें"।
बॉब पोलाक

4
SSL सत्यापन को अक्षम करना किसी भी समस्या का समाधान नहीं है। :-)
सिद्धू

9
यदि आप नोड अनुरोध लाइब्रेरी का उपयोग कर रहे हैं तो यह काम करता है। जो मैं हूं। और धन्यवाद, यह विकास के लिए मेरी तत्काल आवश्यकता को हल करता है।
एलन

29

जिस सर्वर से आप डाउनलोड करने का प्रयास कर रहे हैं वह बुरी तरह से कॉन्फ़िगर किया जा सकता है। यहां तक ​​कि अगर यह आपके ब्राउज़र में काम करता है, तो यह कैश-खाली क्लाइंट को सत्यापित करने के लिए आवश्यक श्रृंखला में सभी सार्वजनिक प्रमाण पत्र शामिल नहीं हो सकता है।

मैं SSLlabs टूल में साइट की जाँच करने की सलाह देता हूं: https://www.ssllabs.com/ssltest/

इस त्रुटि के लिए देखें:

इस सर्वर की सर्टिफिकेट चेन अधूरी है।

और इस:

चैन के मुद्दे ......... अधूरे


मुझे यह प्रमाण मिलता है (चेन इश्यू ......... अधूरा) मेरे सर्टिफिकेट के लिए जो DigiCert Inc. से अधिकृत है, इसे ठीक करने की प्रक्रिया क्या है?
1

@imarchuang संक्षेप में, आपके सर्वर को न केवल आपके डोमेन के लिए प्रमाण पत्र की सेवा करने की आवश्यकता है, बल्कि मध्यवर्ती प्रमाण पत्र भी। मैं इस टिप्पणी में अधिक विवरण नहीं दे सकता, लेकिन उम्मीद है कि आपको सही दिशा में इंगित करने के लिए पर्याप्त जानकारी है।
फ्लिम

बहुत बहुत धन्यवाद, हमने रूट
सर्टिफिकेट

धन्यवाद! मुझे पता चला कि मेरा सर्टिफिकेट अधूरा था, हालांकि यह क्रोम और फायरफॉक्स में पूरी तरह से काम करता था, लेकिन इलेक्ट्रॉन ऐप में काम नहीं करता था, और मैंने इसे नग्नेक्स साइड से तय कियाcat domainname.crt domainname.ca-bundle > domainname-ssl-bundle.crt
इवान बोरशचोव

26

unable to verify the first certificate

सर्टिफिकेट चेन अधूरी है।

इसका मतलब है कि जिस वेबसर्वर को आप कनेक्ट कर रहे हैं वह गलत है और इसे आपके द्वारा भेजी गई सर्टिफिकेट चेन में इंटरमीडिएट सर्टिफिकेट शामिल नहीं है।

प्रमाणपत्र श्रृंखला

इसकी संभावना इस प्रकार है:

  1. सर्वर प्रमाणपत्र - मध्यवर्ती द्वारा हस्ताक्षरित प्रमाण पत्र को संग्रहीत करता है।
  2. इंटरमीडिएट प्रमाणपत्र - रूट द्वारा हस्ताक्षरित प्रमाण पत्र को संग्रहीत करता है।
  3. रूट प्रमाणपत्र - एक स्व-हस्ताक्षरित प्रमाणपत्र संग्रहीत करता है।

सर्वर सर्टिफिकेट के साथ इंटरमीडिएट सर्टिफिकेट सर्वर पर स्थापित किया जाना चाहिए।
रूट प्रमाणपत्र सॉफ्टवेयर अनुप्रयोगों, ब्राउज़रों और ऑपरेटिंग सिस्टम में एम्बेडेड होते हैं।

प्रमाण पत्र की सेवा करने वाले आवेदन को पूरी श्रृंखला भेजनी होती है, इसका अर्थ है सर्वर प्रमाणपत्र स्वयं और सभी मध्यवर्ती। रूट प्रमाणपत्र को क्लाइंट द्वारा ज्ञात किया जाना चाहिए।

समस्या को फिर से बनाएँ

अपने ब्राउज़र का उपयोग करके 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;

संसाधन:

  1. https://levelup.gitconnected.com/how-to-resolve-certificate-errors-in-nodejs-app-involving-ssl-calls-781ce48daded
  2. https://www.npmjs.com/package/ssl-root-cas
  3. https://github.com/nodejs/node/issues/16336
  4. https://www.namecheap.com/support/knowledgebase/article.aspx/9605/69/how-to-check-ca-chain-installation
  5. /superuser/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file/
  6. कैसे कन्वर्ट .crt को .pem

बहुत विस्तृत विवरण।
सात

बिल्कुल अद्भुत! मेरे लिए काम नहीं किया, लेकिन क्या एक विस्तार!
टॉम चदरैविकियस

6

इसने वास्तव में इसे https://www.npmjs.com/package/ssl-root-cas से हल किया

// INCORRECT (but might still work)
var server = https.createServer({
  key: fs.readFileSync('privkey.pem', 'ascii'),
  cert: fs.readFileSync('cert.pem', 'ascii') // a PEM containing ONLY the SERVER certificate
});

// CORRECT (should always work)
var server = https.createServer({
  key: fs.readFileSync('privkey.pem', 'ascii'),
  cert: fs.readFileSync('fullchain.pem', 'ascii') // a PEM containing the SERVER and ALL INTERMEDIATES
});

1
यह सबसे अच्छा समाधान imho है, क्योंकि इसमें अतिरिक्त पुस्तकालयों की आवश्यकता नहीं है और यह सरल है
मार्टिन श्नाइडर

4

आप नीचे दिए गए अनुरोध विकल्पों को संशोधित करके ऐसा करने में सक्षम हो सकते हैं। यदि आप एक स्व-हस्ताक्षरित प्रमाण पत्र या एक लापता मध्यस्थ का उपयोग कर रहे हैं, तो सख्त को गलत करने के लिए प्रमाणपत्र सेट करने से प्रमाणपत्र को मान्य करने के लिए अनुरोध पैकेज मजबूर नहीं करेगा।

var options = {
   host: 'jira.example.com',
   path: '/secure/attachment/206906/update.xlsx',
   strictSSL: false
}

इससे मेरी समस्या हल हो गई, मैं 'http' के बजाय 'अनुरोध' मॉड्यूल का उपयोग कर रहा हूं। धन्यवाद!
ब्रूनो नून्स

2

GoDaddy SSL CCertificate

मैंने GoDaddy सर्टिफिकेट के साथ हमारे बैकएंड एपीआई सर्वर से कनेक्ट करने की कोशिश करते हुए यह अनुभव किया है और यहां वह कोड है जिसका उपयोग मैंने समस्या को हल करने के लिए किया था।

var rootCas = require('ssl-root-cas/latest').create();

rootCas
  .addFile(path.join(__dirname, '../config/ssl/gd_bundle-g2-g1.crt'))
  ;

// will work with all https requests will all libraries (i.e. request.js)
require('https').globalAgent.options.ca = rootCas;

पुनश्च:

बंडल किए गए प्रमाणपत्र का उपयोग करें और लाइब्रेरी स्थापित करना न भूलें npm install ssl-root-cas


1
यह मेरे लिए काम करता है सिवाय इसके कि मुझे आयात करते समय "ssl-root-cas / latest" के बजाय "ssl-root-cas" का उपयोग करना पड़े।
कृष्णन

2

इसने मेरे लिए काम किया => एजेंट को जोड़ा और झूठे को 'रिजेक्ट यूनाउथोराइज़्ड' सेट किया

const https = require('https'); //Add This
const bindingGridData = async () => {
  const url = `your URL-Here`;
  const request = new Request(url, {
    method: 'GET',
    headers: new Headers({
      Authorization: `Your Token If Any`,
      'Content-Type': 'application/json',
    }),
    //Add The Below
    agent: new https.Agent({
      rejectUnauthorized: false,
    }),
  });
  return await fetch(request)
    .then((response: any) => {
      return response.json();
    })
    .then((response: any) => {
      console.log('response is', response);
      return response;
    })
    .catch((err: any) => {
      console.log('This is Error', err);
      return;
    });
};


1

इसे हल करने के लिए एक और तरीका निम्न मॉड्यूल का उपयोग करना है।

node_extra_ca_certs_mozilla_bundle

यह मॉड्यूल PEM फ़ाइल उत्पन्न करके किसी भी कोड संशोधन के बिना काम कर सकता है जिसमें मोज़िला द्वारा विश्वसनीय सभी रूट और मध्यवर्ती प्रमाण पत्र शामिल हैं। आप निम्न पर्यावरण चर का उपयोग कर सकते हैं (Nodejs v7.3 + के साथ काम करता है),

NODE_EXTRA_CA_CERTS

उपरोक्त पर्यावरण चर के साथ उपयोग करने के लिए PEM फ़ाइल उत्पन्न करने के लिए। आप मॉड्यूल का उपयोग कर स्थापित कर सकते हैं:

npm install --save node_extra_ca_certs_mozilla_bundle

और फिर एक पर्यावरण चर के साथ अपनी नोड स्क्रिप्ट लॉन्च करें।

NODE_EXTRA_CA_CERTS=node_modules/node_extra_ca_certs_mozilla_bundle/ca_bundle/ca_intermediate_root_bundle.pem node your_script.js

जनरेट की गई PEM फ़ाइल का उपयोग करने के अन्य तरीके यहां उपलब्ध हैं:

https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle

नोट: मैं उपरोक्त मॉड्यूल का लेखक हूं।


-3

मैं nodemailer npm मॉड्यूल का उपयोग कर रहा था। नीचे दिए गए कोड से समस्या हल हो गई

     tls: {
     // do not fail on invalid certs
     rejectUnauthorized: false
     }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.