पत्ती हस्ताक्षर सत्यापित करने में असमर्थ


142

मैं एक एपीआई तक पहुँचने के लिए node.js request.js का उपयोग कर रहा हूँ। मुझे यह त्रुटि मिल रही है

[त्रुटि: UNABLE_TO_VERIFY_LEAF_SIGNATURE]

मेरे सभी क्रेडेंशियल सटीक और मान्य हैं, और सर्वर ठीक है। मैंने पोस्टमैन के साथ वही अनुरोध किया।

request({
    "url": domain+"/api/orders/originator/"+id,
    "method": "GET",
    "headers":{
        "X-API-VERSION": 1,
        "X-API-KEY": key
    },
}, function(err, response, body){
    console.log(err);
    console.log(response);
    console.log(body);
});

यह कोड केवल एक निष्पादन योग्य स्क्रिप्ट पूर्व में चल रहा है। node ./run_file.js, ऐसा क्यों? क्या इसे सर्वर पर चलाने की आवश्यकता है?


यह एक लंबा शॉट है, लेकिन क्या ऐसा हो सकता है कि एपीआई आपके नोड प्रोग्राम द्वारा पारित किए जा रहे उपयोगकर्ता एजेंट को पहचान नहीं रहा हो?
हेक्टर कोरिआ

1
हम ... इसे भी देखें: blog.gaeremynck.com/fixing-unable_to_verify_leaf_signature
Hector Correa

@ हेक्टर कोरी मैं पोस्टमैन में एपी को पूरी तरह से पढ़ने में सक्षम था। नोड ऐसा क्यों नहीं कर सकता? मैंने उपयोगकर्ता एजेंट को बदलने की कोशिश की, कोई भाग्य नहीं।
थॉमसरेजी

जवाबों:


157

नोट : निम्न खतरनाक है, और एपीआई सामग्री को क्लाइंट और सर्वर के बीच अवरोधन और संशोधित करने की अनुमति देगा।

यह भी काम किया

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';


22
मैंने इसे उखाड़ फेंका, और उत्तर देने के लिए धन्यवाद, लेकिन यह आपकी सुरक्षा के लिए सक्रिय रूप से हानिकारक है। आपको नीचे दिए गए लापता CA प्रति @ CoolAJ86 का जवाब जोड़ना चाहिए।
मिकमेकाना

4
मैं NodeJS प्लगइन का उपयोग कर रहा हूं जिसे कॉल किया गया है nodemailerऔर nodemailer-smtp-transportउसी सामान्य कमांड ने काम किया है। आपको इसे अपनी createTransportवस्तु में जोड़ना होगा :tls:{rejectUnauthorized: false}
ल्यूक

3
हालांकि, मुझे लगता है कि नोडमैलर के साथ समान रूप से असुरक्षित है। नाम में एक सुराग है: यदि किसी चीज की Un अधिकृत है, तो आप आम तौर पर इसे अस्वीकार करना चाहते हैं, परिभाषा के अनुसार। आपको जो आवश्यकता है, उसे सही तरीके से अधिकृत करने के लिए एक तरीका खोजने के लिए (सीए प्रमाण पत्र को ठीक से स्थापित करके, जैसा कि अन्य उत्तर पहले ही कह चुके हैं)।
ब्रूनो

@ ब्रूनो मैं सहमत हूं, आपको इसे प्रमाणपत्रों के साथ सही तरीके से सेट करना चाहिए। मैं केवल एक डेमो के लिए एक त्वरित परीक्षण सेटअप करना चाहता था इसलिए मैंने जो कोड पोस्ट किया है वह एक त्वरित फिक्स है। मुझे अपनी टिप्पणी में इस बारे में पहले से बता देना चाहिए था।
ल्यूक

1
@mikemaccana कोई सुरक्षा समस्या नहीं है यदि अनुरोध एक ही सर्वर पर है और आप केवल स्वामी हैं।
बिनर वेब

89

यह आवेदन के साथ एक मुद्दा नहीं है, लेकिन प्रमाण पत्र के साथ जो एक मध्यस्थ सीए द्वारा हस्ताक्षरित है। यदि आप उस तथ्य को स्वीकार करते हैं और फिर भी आगे बढ़ना चाहते हैं, तो अनुरोध विकल्पों में निम्नलिखित जोड़ें:

rejectUnauthorized: false

पूर्ण अनुरोध:

request({
    "rejectUnauthorized": false,
    "url": domain+"/api/orders/originator/"+id,
    "method": "GET",
    "headers":{
        "X-API-VERSION": 1,
        "X-API-KEY": key
    },
}, function(err, response, body){
    console.log(err);
    console.log(response);
    console.log(body);
});

मुझे काम में अभी यह समस्या है। मैंने एक आईटी टिकट प्रस्तुत किया जिसमें उन्हें बताया गया कि एसएसएल गलत तरीके से प्रस्तुत किया जा सकता है - उन्होंने मुझे बताया कि मैं क्रेज़ी था। क्या कोई और जानकारी है जो मैं उन्हें इस मुद्दे को हल करने के लिए दे सकता हूं?
ब्लेकवि

यह वास्तव में सही नहीं है: जैसा कि CoolAJ86 और हेक्टरकोरिया उल्लेख करते हैं, प्रमाण पत्र मान्य है, लेकिन यह एक मध्यस्थ सीए द्वारा हस्ताक्षरित है।
मिकमेकाना

80

सुरक्षित समाधान

सुरक्षा को बंद करने के बजाय आप श्रृंखला में आवश्यक प्रमाणपत्र जोड़ सकते हैं। पहले npm से ssl-root-cas पैकेज स्थापित करें :

npm install ssl-root-cas

इस पैकेज में कई मध्यस्थ प्रमाणपत्र शामिल हैं जो ब्राउज़र पर भरोसा करते हैं लेकिन नोड नहीं करता है।

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()

लापता प्रमाण पत्र जोड़ देगा। और अधिक जानकारी के लिए यहां देखें:

https://git.coolaj86.com/coolaj86/ssl-root-cas.js

इसके अलावा, अगला जवाब नीचे देखें


2
क्या एचटीपी क्लाइंट विंडोज ट्रस्टेड रूट सर्टिफिकेशन अथॉरिटीज सर्टिफिकेट स्टोर का उपयोग नहीं करता है?
रिचर्ड कोलेट

1
नोड बाइनरी में बंडल किए गए मोज़िला सेर्ट्स का उपयोग करता है और जब भी आप अपनी caसरणी की आपूर्ति करते हैं तो यह उन्हें ओवरराइड करता है । मुझे नहीं पता कि इसका http मॉड्यूल OS श्रृंखला को भी देखेगा या नहीं। हालांकि, ओएस एक्स पर कर्ल केवल ओएस श्रृंखला का उपयोग करने के लिए लगता है और मैन्युअल रूप से निर्दिष्ट समारोहों की अनुमति नहीं देता है।
कूलजोरी

क्या इसे प्रत्येक प्रक्रिया के लिए चलाया जाना चाहिए या क्या मैं इसे एक बार चला सकता हूं और विश्व स्तर पर अपने प्रमाण पत्र अपडेट कर सकता हूं?
जोशुआ स्नाइडर

प्रमाण पत्र संभावित रूप से दो स्थानों पर संग्रहीत किए जाते हैं: (1) बिल्ट-इन नोड .js बाइनरी (2) ऑपरेटिंग सिस्टम कीस्टोर। यदि आपके सेरेक्ट आउट ऑफ डेट हैं तो आपको इसे अपने रनिंग कोड में शामिल करना होगा। यह न तो बाइनरी बाइनरी को बदलता है और न ही आपके ऑपरेटिंग सिस्टम को - सिर्फ प्रोजेक्ट फोल्डर को।
कूलजोरी

1
@Sunkas यह वही है जो त्रुटि संदेश कहता है। मैं नहीं जानता कि इसे कैसे सरल समझा जा सकता है। यह केवल पढ़ने वाली फ़ाइल है और इसे संपादित नहीं किया जा सकता है।
coolaj86

45

CoolAJ86 का समाधान सही है और यह आपकी सुरक्षा से समझौता नहीं करता है जैसे कि सभी चेक का उपयोग rejectUnauthorizedकर अक्षम करना या NODE_TLS_REJECT_UNAUTHORIZED। फिर भी, आपको अतिरिक्त CA के प्रमाण पत्र को स्पष्ट रूप से इंजेक्ट करने की आवश्यकता हो सकती है।

मैंने पहले ssl-root-cas मॉड्यूल द्वारा शामिल रूट CA की कोशिश की :

require('ssl-root-cas/latest')
  .inject();

मैं अभी भी UNABLE_TO_VERIFY_LEAF_SIGNATUREत्रुटि के साथ समाप्त हुआ । तब मुझे पता चला कि मैं COMODO SSL विश्लेषक द्वारा जिस वेब साइट से जुड़ रहा था, उसके लिए प्रमाणपत्र जारी किया था , उस प्राधिकरण का प्रमाणपत्र डाउनलोड किया और केवल उसी को जोड़ने का प्रयास किया:

require('ssl-root-cas/latest')
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');

मैं एक और त्रुटि के साथ समाप्त हुआ CERT_UNTRUSTED:। अंत में, मैंने अतिरिक्त रूट CA को इंजेक्ट किया और इसमें "my" (जाहिरा तौर पर मध्यस्थ) CA शामिल था, जिसने काम किया:

require('ssl-root-cas/latest')
  .inject()
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');

1
मैं COMODO हाई-एश्योरेंस सिक्योर सर्वर CA द्वारा जारी प्रमाणित के साथ एक वेब साइट से जुड़ रहा था। मैंने उनके डाउनलोड पृष्ठ से प्रमाण पत्र डाउनलोड किया ।
फर्डिनेंड प्रांटल

2
धन्यवाद! मेरी समस्या के लिए मुझे इस त्रुटि को पूरा करने के लिए सभी श्रृंखलाओं को जोड़ना होगा। दूसरों के संदर्भ के लिए, इस पोस्ट ने मुझे दिखाया कि कैसे आसानी से फ़ायरफ़ॉक्स के माध्यम से आवश्यक pem फ़ाइलों को निर्यात किया जा सकता है: superuser.com/a/97203
mfink

अच्छी तरह से मदद के लिए धन्यवाद। मेरे मामले में, अंत में यह एसएसएल सर्वर का खराब कॉन्फ़िगरेशन था, नोड नहीं। सभी मध्यवर्ती सर्वर पर सर्वर स्थापित नहीं थे।
स्कॉट जुंगविर्थ

यदि आप इसे .cerचलाने के openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crtलिए एक प्रमाण के रूप में प्रमाण प्राप्त करते हैं, तो इसे टा .crtपहले से बदल दें
0x1gene

8

के लिए बनाएं प्रतिक्रिया अनुप्रयोग (जहां इस त्रुटि भी होता है और इस सवाल का # 1 गूगल परिणाम है), तो आप शायद का उपयोग कर रहे HTTPS=true npm startहैं और एक proxy(में package.json), जो विकास में कुछ HTTPS एपीआई जो अपने आप स्व-हस्ताक्षरित है, जब को जाता है।

अगर ऐसा है, तो proxyइस तरह बदलने पर विचार करें:

"proxy": {
  "/api": {
    "target": "https://localhost:5001",
    "secure": false
  }
}

secure यह तय करता है कि वेबपैक प्रॉक्सी सर्टिफिकेट चेन की जांच करता है या नहीं और यह सुनिश्चित करने में अक्षम है कि एपीआई स्व-हस्ताक्षरित प्रमाण पत्र सत्यापित नहीं है ताकि आपको अपना डेटा मिल जाए।


4

यह करना rejectUnauthorized: falseया process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';ना करना बहुत लुभावना हो सकता है! यह आपको मध्य हमलों में आदमी को उजागर करता है।

अन्य उत्तर सही हैं कि मुद्दा इस तथ्य में निहित है कि आपका प्रमाण पत्र "एक मध्यस्थ सीए द्वारा हस्ताक्षरित है।" इसका एक आसान समाधान है, जिसे किसी तीसरे पक्ष के पुस्तकालय की आवश्यकता नहीं होती है ssl-root-casया किसी अतिरिक्त सीए को नोड में इंजेक्ट करने की आवश्यकता नहीं है ।

नोड समर्थन विकल्पों में अधिकांश https क्लाइंट आपको अनुरोध प्रति CA निर्दिष्ट करने की अनुमति देते हैं, जो हल करेगा UNABLE_TO_VERIFY_LEAF_SIGNATURE। यहां नोड के अंतर्निहित इंट httpsमॉड्यूल का उपयोग करके एक सरल उदाहरण दिया गया है ।

import https from 'https';

const options = {
  host: '<your host>',
  defaultPort: 443,
  path: '<your path>',
  // assuming the bundle file is co-located with this file
  ca: readFileSync(__dirname + '/<your bundle file>.ca-bundle'),
  headers: {
    'content-type': 'application/json',
  }
};
https.get(options, res => {
  // do whatever you need to do
})

यदि, हालाँकि, आप अपने होस्टिंग सर्वर में ssl सेटिंग्स को कॉन्फ़िगर कर सकते हैं, तो सबसे अच्छा समाधान यह होगा कि आप अपने होस्टिंग प्रदाता से इंटरमीडिएट प्रमाणपत्र जोड़ दें। इस तरह क्लाइंट रिक्वायरमेंट को CA निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि यह सर्वर में ही शामिल है। मैं व्यक्तिगत रूप से namecheap + heroku का उपयोग करता हूं। मेरे लिए चाल एक .crt फ़ाइल बनाने की थी cat yourcertificate.crt bundle.ca-bundle > server.crt। मैंने तब इस फ़ाइल को खोला और पहले प्रमाण पत्र के बाद एक नई पंक्ति जोड़ी। आप और अधिक पढ़ सकते हैं

https://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl


यह बग ज्यादातर स्थानीय वातावरण में आता है, उत्पादन में नहीं, इसलिए यदि आप इसके करने के लिए स्थानीय ठीक हैं: process.env ['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
विवेक्स

@Vivex - स्थानीय परिवेश में ऐसा करना ठीक नहीं है यदि पूरा बिंदु यह परीक्षण करने का है कि आपके एसएसएल
सीट्स

2

इस मामले में यहाँ डालने से किसी को मदद मिलती है, मेरा मामला अलग था और एक अजीब सा मिश्रण था। मुझे यह एक अनुरोध पर मिल रहा था जिसे सुपरएजेंट के माध्यम से एक्सेस किया गया था - समस्या का प्रमाण पत्र (जो ठीक से सेटअप थे) और इस तथ्य के साथ करने के लिए कुछ भी नहीं था कि मैं तब async मॉड्यूल के झरना कॉलबैक के माध्यम से सुपरगेंट परिणाम पारित कर रहा था । ठीक करने के लिए: पूरे परिणाम को पारित करने के बजाय, बस result.bodyझरने के कॉलबैक से गुजरें।


2

मेरे पास वही मुद्दे थे। मैंने @ThomasReggi और @ CoolAJ86 समाधान का अनुसरण किया है और अच्छी तरह से काम किया है लेकिन मैं समाधान से संतुष्ट नहीं हूं।

क्योंकि "UNABLE_TO_VERIFY_LEAF_SIGNATURE" समस्या प्रमाणन कॉन्फ़िगरेशन स्तर के कारण हुई है।

मैं @thenderender समाधान को स्वीकार करता हूं, लेकिन इसका आंशिक समाधान। nginx आधिकारिक वेबसाइट के अनुसार, उन्होंने स्पष्ट रूप से उल्लेख किया प्रमाणपत्र सर्वर प्रमाणपत्र और जंजीर प्रमाण पत्र का संयोजन होना चाहिए।

यहां छवि विवरण दर्ज करें


2

आप इस तरह से सख्तSSL सेट करके भी प्रयास कर सकते हैं false:

{  
   url: "https://...",
   method: "POST",
   headers: {
        "Content-Type": "application/json"},
   strictSSL: false
}

यह काम करता है अगर आपका नोड एनडीएस एप्लीकेशन से भेज रहा है, तो भयानक !!
सहयोगी Makongo

0

एक उपडोमेन पर एक GoDaddy प्रमाणपत्र स्थापित करने के बाद मेरे अपाचे कॉन्फ़िगरेशन के साथ एक समस्या थी। मैंने मूल रूप से सोचा था कि यह नोड के साथ सर्वर नाम संकेतक (एसएनआई) नहीं भेजने का मुद्दा हो सकता है, लेकिन ऐसा नहीं था। Https://www.ssllabs.com/ssltest/ के साथ उपडोमेन के एसएसएल प्रमाणपत्र का विश्लेषण करते हुए त्रुटि श्रृंखला के मुद्दों को लौटाया : अपूर्ण

Apache निर्देश के gd_bundle-g2-g1.crtमाध्यम से GoDaddy प्रदान की गई फ़ाइल को जोड़ने के बाद SSLCertificateChainFile, नोड HTTPS से कनेक्ट करने में सक्षम था और त्रुटि चली गई।


0

आपको अपने सर्वर में इंटरमीडिएट प्रमाण पत्र को शामिल करना होगा। यह [त्रुटि: UNABLE_TO_VERIFY_LEAF_SIGNATURE] को हल करता है


0

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

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

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


0

यदि आप इस धागे पर आते हैं क्योंकि आप नोड पोस्टग्रेज / पीजी मॉड्यूल का उपयोग कर रहे हैं, तो सेटिंग से बेहतर समाधान है NODE_TLS_REJECT_UNAUTHORIZEDया rejectUnauthorized, जिससे असुरक्षित कनेक्शन हो जाएगा।

इसके बजाय, tls.connect के मापदंडों से मिलान करने के लिए "ssl" विकल्प को कॉन्फ़िगर करें :

{
  ca: fs.readFileSync('/path/to/server-ca.pem').toString(),
  cert: fs.readFileSync('/path/to/client-cert.pem').toString(),
  key: fs.readFileSync('/path/to/client-key.pem').toString(),
  servername: 'my-server-name' // e.g. my-project-id/my-sql-instance-id for Google SQL
}

मैं की तरह वातावरण चर से इन विकल्पों को पार्स के साथ मदद करने के लिए एक मॉड्यूल लिखा है PGSSLROOTCERT, PGSSLCERTऔर PGSSLKEY:

https://github.com/programmarchy/pg-ssl


-1

निम्नलिखित आदेशों ने मेरे लिए काम किया:

> npm config set strict-ssl false
> npm cache clean --force

समस्या यह है कि आप खराब या अविश्वसनीय एसएसएल [सुरक्षित सॉकेट लेयर] प्रमाण पत्र के साथ एक रिपॉजिटरी से एक मॉड्यूल स्थापित करने का प्रयास कर रहे हैं। एक बार जब आप कैश को साफ करते हैं, तो यह समस्या हल हो जाएगी। आपको इसे बाद में सही करने की आवश्यकता हो सकती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.