ত্রুটি: নোডজেজে প্রথম শংসাপত্রটি যাচাই করতে অক্ষম


141

আমি url ব্যবহার করে জিরা সার্ভার থেকে একটি ফাইল ডাউনলোড করার চেষ্টা করছি তবে আমি একটি ত্রুটি পাচ্ছি। ত্রুটি যাচাই করতে কোডটিতে শংসাপত্র কীভাবে অন্তর্ভুক্ত করবেন :

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

আপনার আবেদন

SSL এর রুট CA গুলির npm প্যাকেজ (যেমন এখানে ব্যবহৃত) এই সমস্যা সম্বন্ধে একটি খুব দরকারী প্যাকেজ।


9
এই উত্তরটি বেশিরভাগ ক্ষেত্রে ব্যবহার করা উচিত কারণ এটি SSL এর পুরো সুবিধাটি অক্ষম করার পরিবর্তে সমস্যাটি স্থির করে।
মাইকম্যাকানা

12
এসএসএল-রুট-ক্যাস মডিউল README তে বর্ণিত হিসাবে, এই সমস্যাটির অন্যতম সাধারণ কারণ হ'ল আপনার শংসাপত্রটি এর মধ্যবর্তী সিএ শংসাপত্রগুলি এম্বেড করে না। অন্য কিছু চেষ্টা করার আগে আপনার শংসাপত্রটি ঠিক করার চেষ্টা করুন;)
লরেন্ট ভিবি

এমনকি আপনার এসএসএল-রুট-ক্যাস প্যাকেজটির প্রয়োজনও পড়বে না। কেবলমাত্র একটি গ্লোবাল এজেন্টস.অপশন.সেসার্টকে একটি পূর্ণচয়ন শংসাপত্রের জন্য সেট করুন। এটাই আমার সমস্যার সমাধান করেছে।
স্মার্টটেক্সার্ট

1
mkcert "ফুলচেইন" শংসাপত্র তৈরি করে না। আপনাকে $(mkcert -CAROOT)/rootCA.pemনতুন শংসাপত্রের ফাইলে পাওয়া রুট সার্টিফিকেটের সাথে আপনার শংসাপত্রটি জড়িত করতে হবে এবং github.com/FiloSottil/mkcert/issues/76https.globalAgent.options.ca = fs.readFileSync('fullchain.pem') দেখুন
ফ্রস্টি জেড

সুরক্ষার বিবেচনারssl-root-cas জন্য , এনপিএম মডিউলটির একটি অনুরোধ আছে mozilla.org হার্ডকোড করা git.coolaj86.com/coolaj86/ssl-root-cas.js/src/branch/master/… । এটি সম্ভবত নিরাপদ কারণ মজিলা তবে এটি আক্রমণ ভেক্টরের মতো বলে মনে হচ্ছে।
অবিন্দ্র গলচরণ

60

আরেকটি নোংরা হ্যাক, যা আপনার সমস্ত অনুরোধকে সুরক্ষিত করে তুলবে:

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0

8
এটি উপরের Labeo এর উত্তর থেকে পৃথক বলে মনে হচ্ছে না ঠিক যেমন বিপজ্জনক।
ocramot

4
এটি ভিন্ন, এনভির ভেরিয়েবল উত্স কোডের বাইরে সেট করা যায় বলে এর কোনও কোডিং পরিবর্তন দরকার হয় না।
jzacharuk

1
এই উত্তরটি বিপজ্জনক। আপনি টিএলএস সরবরাহ করে এমন কোনও সুরক্ষা অক্ষম করছেন।
ফ্লিম

1
এটি আমার পক্ষে অত্যন্ত সহায়ক super আমার ক্ষেত্রে, আমি কেবল লোকালহোস্টের সাথে কথা বলছি , তাই সুরক্ষা সমস্যা নয়।
মাইক এস

খালি প্রকৃতপক্ষে লোকালহোস্ট পরীক্ষা করার জন্য। আপনার পরীক্ষাগুলির পরে আপনি এটি সরিয়েছেন তা নিশ্চিত করুন।
নিকো

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
এসএসএল যাচাইকরণ অক্ষম করা কোনও সমস্যার সমাধান নয়: :-)
সিদ্ধু

9
আপনি যদি নোড অনুরোধ লাইব্রেরি ব্যবহার করেন তবে এটি কাজ করে। যা আমি। এবং আপনাকে ধন্যবাদ, এটি আমার তাত্ক্ষণিক বিকাশের প্রয়োজনীয়তার সমাধান করে।
অ্যালান

29

আপনি যে সার্ভারটি ডাউনলোড করার চেষ্টা করছেন তা খারাপভাবে কনফিগার করা হয়েছে। এমনকি যদি এটি আপনার ব্রাউজারে কাজ করে তবে তা ক্যাশে-খালি ক্লায়েন্ট যাচাই করার জন্য প্রয়োজনীয় চেইনে সমস্ত পাবলিক শংসাপত্রগুলি অন্তর্ভুক্ত নাও হতে পারে।

আমি এসএসএল্ল্যাব সরঞ্জামে সাইটটি পরীক্ষা করার পরামর্শ দিচ্ছি: https://www.ssllabs.com/ssltest/

এই ত্রুটিটি দেখুন:

এই সার্ভারের শংসাপত্র শৃঙ্খলা অসম্পূর্ণ।

এবং এই:

চেইন ইস্যু ......... অসম্পূর্ণ


ডিজিকার্ট ইনক। থেকে অনুমোদিত আমার শংসাপত্রের জন্য আমি এই ইস্যুটি (চেইন ইস্যু ......... অসম্পূর্ণ) পেয়েছি, এটি ঠিক করার পদ্ধতি কী?
imarchuang

@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 তারপরে আপনাকে বিন্যাসে অন্তর্বর্তী মাধ্যমিক শংসাপত্রটি পেতে হবে

2 এ: নোডের অন্তর্নির্মিত শংসাপত্রের স্টোর ব্যবহার করে প্রসারিত করুন NODE_EXTRA_CA_CERTS,

2 বি: বা ব্যবহার করে আপনার নিজস্ব শংসাপত্র বান্ডেল (মধ্যস্থতা এবং মূল) পাস করুন rootca বিকল্পটি ।

আমি কীভাবে মধ্যবর্তী সার্টিফিকেট পেতে পারি?

ব্যবহার 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

2A। NODE_EXTRA_CERTS

আমি ফাইলের মধ্যে পরিবেশের ভেরিয়েবলগুলি সেট করতে ক্রস-এনভিভ ব্যবহার করছি package.json:

"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"

2b। caপছন্দ

এই বিকল্পটি নোডের অন্তর্নির্মিত মূল সিএগুলি ওভাররাইট করতে চলেছে।

এজন্য আমাদের নিজস্ব রুট সিএ তৈরি করতে হবে এসএসএল-রুট-ক্যাস ব্যবহার করুন ।

তারপরে, 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
এটিই হ'ল সেরা সমাধান, কারণ এটি অতিরিক্ত গ্রন্থাগারগুলির প্রয়োজন হয় না এবং এটি সহজ
মার্টিন শ্নাইডার

4

আপনি নীচের মতো অনুরোধ বিকল্পগুলি সংশোধন করে এটি করতে সক্ষম হতে পারেন। আপনি যদি স্ব-স্বাক্ষরিত শংসাপত্র বা অনুপস্থিত মধ্যস্থতাকারী ব্যবহার করে থাকেন তবে কঠোর এসএসএলকে মিথ্যা হিসাবে সেট করা অনুরোধ প্যাকেজটিকে শংসাপত্রটি বৈধতা দিতে বাধ্য করবে না।

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

এটি আমার সমস্যার সমাধান করেছে, আমি 'http' এর পরিবর্তে 'অনুরোধ' মডিউলটি ব্যবহার করছি। ধন্যবাদ!
ব্রুনো নুনস

2

GoDaddy এসএসএল প্রত্যয়

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
আমদানি করার সময় আমাকে "এসএসএল-রুট-ক্যাস / সর্বশেষ" এর পরিবর্তে "এসএসএল-রুট-ক্যাস" ব্যবহার করতে হয়েছিল তা ছাড়া এটি আমার পক্ষে কাজ করেছিল।
কৃষ্ণন

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

এই মডিউলটি কোনও কোড পরিবর্তন ছাড়াই কাজ করতে পারে একটি পিইএম ফাইল তৈরি করে যা মজিলা দ্বারা বিশ্বাসযোগ্য সমস্ত মূল এবং মধ্যবর্তী শংসাপত্রগুলি অন্তর্ভুক্ত করে। আপনি নীচের পরিবেশ পরিবর্তনশীল (নোডেজ v7.3 + এর সাথে কাজ করে) ব্যবহার করতে পারেন,

NODE_EXTRA_CA_CERTS

উপরের পরিবেশের ভেরিয়েবলের সাথে ব্যবহারের জন্য পিইএম ফাইল তৈরি করতে। আপনি মডিউলটি ব্যবহার করে ইনস্টল করতে পারেন:

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

আমি নোডমিলার এনপিএম মডিউলটি ব্যবহার করছিলাম। নীচের কোডটি সমস্যার সমাধান করেছে

     tls: {
     // do not fail on invalid certs
     rejectUnauthorized: false
     }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.