পাতার স্বাক্ষর যাচাই করতে অক্ষম


142

আমি এপিআই-তে পৌঁছানোর জন্য নোড.জেএস রিকোয়েস্ট.জেএস ব্যবহার করছি। আমি এই ত্রুটি পাচ্ছি

[ত্রুটি: 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, তাই বলে? এটি একটি সার্ভার চালানোর প্রয়োজন?


এটি একটি দীর্ঘ শট, তবে এটি কি এমন হতে পারে যে আপনার নোড প্রোগ্রামটি দ্বারা পাস করা ইউজার এজেন্টকে এপিআই স্বীকৃতি দিচ্ছে না?
হেক্টর Correa


@ হেক্টরকরিয়া আমি পোস্টম্যান এপিআই পুরোপুরি পড়তে সক্ষম হয়েছি। কেন নোড এটি করতে পারে না? আমি ব্যবহারকারী এজেন্ট পরিবর্তন করার চেষ্টা করেছি, ভাগ্য নেই।
থমাসরেগি

উত্তর:


157

দ্রষ্টব্য : নিম্নলিখিতটি বিপজ্জনক, এবং ক্লায়েন্ট এবং সার্ভারের মধ্যে এপিআই সামগ্রীকে আটকানো এবং সংশোধন করার অনুমতি দেবে।

এটিও কাজ করেছিল

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


22
আমি এটি উন্নত করেছি এবং উত্তর দেওয়ার জন্য ধন্যবাদ, তবে এটি আপনার সুরক্ষার জন্য সক্রিয়ভাবে ক্ষতিকারক। নীচে @ CoolAJ86 এর উত্তর অনুসারে আপনার অনুপস্থিত সিএ যুক্ত করা উচিত।
মাইকমেকানা

4
আমি ব্যবহার করছি NodeJS নামক প্লাগইন nodemailerএবং nodemailer-smtp-transportএবং একই সাধারণ কমান্ড কাজ করেন। আপনাকে এটিকে আপনার createTransportঅবজেক্টে যুক্ত করতে হবে:tls:{rejectUnauthorized: false}
লুকপি

3
যদিও আমি অনুমান করি নোডমিলারের সাথে লুকপি সমানভাবে নিরাপত্তাহীন সেখানে নামে একটি সুরুক আছে: যদি কিছু এর নিঃ অনুমোদিত, আপনি সাধারণত এটা প্রত্যাখ্যান করার সংজ্ঞা দ্বারা চাই। আপনার যা প্রয়োজন তা হ'ল এটিকে সঠিকভাবে অনুমোদনের কোনও উপায় অনুসন্ধান করা (সিএ শংসাপত্রগুলি যথাযথভাবে সেটআপ করে, যেমন অন্যান্য উত্তর ইতিমধ্যে বলেছে)।
ব্রুনো

@ ব্রুনো আমি সম্মত, আপনার এটি শংসাপত্র সহ সঠিক উপায়ে সেট আপ করা উচিত। আমি কেবল একটি ডেমোটির জন্য একটি দ্রুত পরীক্ষা সেটআপ করতে চেয়েছিলাম যাতে আমার পোস্ট করা কোডটি একটি দ্রুত ফিক্স। আমি আমার মন্তব্যে যে উপস্থাপনা করা উচিত ছিল।
লুকপি

1
@ মাইকমেচানা অনুরোধটি যদি একই সার্ভারে থাকে এবং আপনি কেবলমাত্র মালিক হন তবে কোনও সুরক্ষা সমস্যা নেই।
বিনার ওয়েব

89

এটি অ্যাপ্লিকেশনটির সাথে সমস্যা নয়, তবে শংসাপত্রের সাথে যা কোনও মধ্যস্থতাকারী সিএ স্বাক্ষরিত with আপনি যদি সেই সত্যটি গ্রহণ করেন এবং এখনও এগিয়ে যেতে চান তবে বিকল্পগুলির জন্য অনুরোধ করতে নিম্নলিখিতটি যুক্ত করুন:

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

আমার এখনই কর্মক্ষেত্রে এই সমস্যাটি রয়েছে। আমি তাদের একটি আইটি টিকিট জমা দিয়েছিলাম যাতে এসএসএল ভুল কনফিগার করা হতে পারে - তারা আমাকে বলেছিল যে আমি ক্রেজি was এই সমস্যাটি সমাধানের জন্য আমি তাদের আরও কি আরও তথ্য দিতে পারি?
ব্লেকভ

এটি আসলে সঠিক নয়: CoolAJ86 এবং হেক্টরকোরিয়া হিসাবে উল্লেখ করা হয়েছে, শংসাপত্রটি বৈধ, তবে এটি একটি মধ্যস্থতাকারী CA দ্বারা স্বাক্ষরিত।
মাইকমেকানা

80

নিরাপদ সমাধান

সুরক্ষা বন্ধ করার পরিবর্তে আপনি প্রয়োজনীয় শংসাপত্রগুলি চেইনে যুক্ত করতে পারেন। প্রথমে এনপিএম থেকে এসএসএল-রুট-ক্যাস প্যাকেজ ইনস্টল করুন :

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 মডিউলটি ওএস চেইনের দিকেও তাকিয়ে থাকবে। তবে, ওএস এক্স-এর কার্লটি কেবল ওএস চেইন ব্যবহার করে এবং ম্যানুয়ালি নির্দিষ্ট করা শংসাপত্রগুলি মঞ্জুরি দেয় না।
coolaj86

এটি কি প্রতিটি প্রক্রিয়াটির জন্য চালাতে হবে নাকি আমি একবার এটি চালাতে পারি এবং বিশ্বব্যাপী আমার শংসাপত্রগুলি আপডেট করতে পারি?
জোশুয়া স্নাইডার

শংসাপত্রগুলি সম্ভাব্য দুটি স্থানে সংরক্ষণ করা হয়: (1) নোড.জেএস বাইনারি (2) অপারেটিং সিস্টেম কীস্টোরের অন্তর্নির্মিত। যদি আপনার শংসাপত্রগুলির মেয়াদ শেষ হয়ে যায় তবে আপনার এটি আপনার চলমান কোডে অন্তর্ভুক্ত করতে হবে। এটি নোড বাইনারি বা আপনার অপারেটিং সিস্টেম পরিবর্তন করে না - কেবল প্রকল্প ফোল্ডার।
coolaj86

1
@ সুঙ্কাস ত্রুটি বার্তাগুলি ঠিক তাই বলে। আমি এটিকে আরও সহজ ব্যাখ্যা করতে জানি না। এটি কেবল পঠনযোগ্য ফাইল এবং সম্পাদনা করা যায় না।
coolaj86

45

CoolAJ86 এর সমাধানটি সঠিক এবং এটি ব্যবহার করে সমস্ত চেক অক্ষম করার মতো rejectUnauthorizedবা আপনার সুরক্ষার সাথে আপস করে না NODE_TLS_REJECT_UNAUTHORIZED। তবুও, আপনাকে অতিরিক্ত সিএর শংসাপত্র স্পষ্টত ইনজেকশন করতে হতে পারে।

আমি প্রথমে এসএসএল-রুট-ক্যাস মডিউল দ্বারা অন্তর্ভুক্ত মূল সিএগুলি চেষ্টা করেছিলাম :

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

আমি এখনও UNABLE_TO_VERIFY_LEAF_SIGNATUREত্রুটি দিয়ে শেষ । তারপরে আমি জানতে পারি যে কমোডো এসএসএল এনালাইজারের মাধ্যমে আমি যে ওয়েব সাইটের সাথে সংযোগ করছি সেটির জন্য কে শংসাপত্র জারি করেছে , সেই কর্তৃপক্ষের শংসাপত্রটি ডাউনলোড করেছে এবং কেবলমাত্র এটি যুক্ত করার চেষ্টা করেছে:

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

আমি অন্য ত্রুটি সঙ্গে শেষ পর্যন্ত: CERT_UNTRUSTED। অবশেষে, আমি অতিরিক্ত মূল সিএগুলিতে ইনজেকশন দিয়েছিলাম এবং "আমার" (স্পষ্টতই মধ্যস্থতাকারী) সিএ অন্তর্ভুক্ত করেছি, যা কাজ করেছিল:

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

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

2
ধন্যবাদ! আমার সমস্যাটির জন্য আমার এই ত্রুটিটি পেরিয়ে যাওয়ার জন্য শৃঙ্খলার পুরো শৃঙ্খলা যুক্ত করা দরকার। অন্যদের রেফারেন্সের জন্য, এই পোস্টটি আমাকে ফায়ারফক্সের মাধ্যমে প্রয়োজনীয় পেম ফাইলগুলি সহজেই রফতানি করতে দেখিয়েছে: superuser.com/a/97203
এমফিংক

সাহায্যের জন্য ধন্যবাদ। আমার ক্ষেত্রে, শেষ পর্যন্ত এটি SSL সার্ভারের একটি খারাপ কনফিগারেশন ছিল, নোড নয়। সমস্ত মধ্যবর্তী শংসাপত্রগুলি সার্ভারে ইনস্টল করা হয়নি।
স্কট জংউথर्थ

আপনি যদি আগেভাগেই তা রূপান্তর করতে এটির .cerরান হিসাবে openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt.crt
শংসাপত্রটি পান

8

জন্য তৈরি করুন প্রতিক্রিয়া অ্যাপ (যেখানে এই ত্রুটি খুব ঘটে এবং এই প্রশ্নের # 1 টি Google ফল), আপনি সম্ভবত ব্যবহার করছেন 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';কিন্তু এটা না! এটি মধ্য আক্রমণগুলিতে আপনাকে মানুষের সামনে তুলে ধরে।

অন্যান্য উত্তরগুলি সঠিক যে সমস্যাটি সত্য যে আপনার সার্টটি "একটি মধ্যস্থতাকারী CA দ্বারা স্বাক্ষরিত হয়েছে" এর মধ্যে রয়েছে lies এটির একটি সহজ সমাধান রয়েছে, এটির ssl-root-casজন্য নোডে কোনও অতিরিক্ত সিএ বা ইনজেকশন দেওয়ার মতো কোনও তৃতীয় পক্ষের লাইব্রেরির প্রয়োজন হয় না ।

নোড সমর্থন বিকল্পের বেশিরভাগ https ক্লায়েন্টগুলি আপনাকে অনুরোধ অনুযায়ী একটি সিএ নির্দিষ্ট করার অনুমতি দেয় যা সমাধান করবে 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
})

তবে, আপনি যদি আপনার হোস্টিং সার্ভারে এসএসএল সেটিংস কনফিগার করতে পারেন তবে সর্বোত্তম সমাধান হ'ল আপনার হোস্টিং সরবরাহকারীর মধ্যে অন্তর্বর্তী শংসাপত্র যুক্ত করা। এইভাবে ক্লায়েন্টের অনুরোধকারীকে কোনও সিএ নির্দিষ্ট করার দরকার নেই, কারণ এটি সার্ভারে অন্তর্ভুক্ত রয়েছে। আমি ব্যক্তিগতভাবে নেমচিপ + হিরকু ব্যবহার করি। আমার জন্য কৌশলটি ছিল একটি দিয়ে .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


এই বাগটি বেশিরভাগ স্থানীয় পরিবেশে আসে, উত্পাদনে নয়, সুতরাং আপনি যদি স্থানীয় থাকেন তবে এটি করা ভাল: প্রক্রিয়া.এনভি ['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
ভিভেক্স

@ ভিভেক্স - যদি আপনার এসএসএল
শংসাপত্রগুলি

2

কাউকে সাহায্য করে এমন ক্ষেত্রে এটি এখানে রাখুন, আমার কেসটি আলাদা ছিল এবং কিছুটা বিজোড় মিশ্রণ ছিল। আমার একটি অনুরোধ যে মাধ্যমে অ্যাক্সেস করা হয়েছে এই পেয়ে ছিল superagent - সমস্যা সার্টিফিকেট (যা সঠিকভাবে সেটআপ ছিল) সঙ্গে কিছুই করার এবং সমস্ত সত্য যে আমি তখন মাধ্যমে superagent ফলাফলের ক্ষণস্থায়ী ছিল সঙ্গে কি ছিল ASYNC মডিউল এর জলপ্রপাত কলব্যাক। ঠিক করার জন্য: পুরো ফলাফলটি পাস করার পরিবর্তে কেবল result.bodyজলপ্রপাতের কলব্যাকটি দিয়ে যান।


2

আমারও একই সমস্যা ছিল। আমি @ থমাসরেগি এবং @ কুলএজে 86 সমাধানটি অনুসরণ করেছি এবং ভাল কাজ করেছি তবে আমি সমাধানটির সাথে সন্তুষ্ট নই।

কারণ "UNABLE_TO_VERIFY_LEAF_SIGNATURE" সমস্যা শংসাপত্র কনফিগারেশন স্তরের কারণে ঘটেছে।

আমি @thirdender সমাধান কিন্তু প্রতি তার আংশিক solution.As গ্রহণ nginx অফিসিয়াল ওয়েবসাইট, তারা পরিষ্কারভাবে উল্লেখ শংসাপত্র সার্ভার শংসাপত্র এবং শৃঙ্খলিত সার্টিফিকেট সমন্বয় হওয়া উচিত।

এখানে চিত্র বর্ণনা লিখুন


1

এছাড়াও আপনি সেট করে চেষ্টা করতে পারেন strictSSL করতে false, এভাবে:

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

0

সাবডোমেইনে GoDaddy শংসাপত্র ইনস্টল করার পরে আমার আমার অ্যাপাচি কনফিগারেশনে সমস্যা ছিল। আমি প্রাথমিকভাবে ভেবেছিলাম এটি নোডের সাথে সার্ভার নেম সূচক (এসএনআই) না প্রেরণের একটি সমস্যা হতে পারে, তবে এটি ছিল না। Https://www.ssllabs.com/ssltest/ দিয়ে সাবডোমেনের এসএসএল শংসাপত্র বিশ্লেষণ করে চেইনের সমস্যাগুলি ত্রুটি ফিরে পেয়েছিল: অসম্পূর্ণ

অ্যাপাচি নির্দেশিকার gd_bundle-g2-g1.crtমাধ্যমে গোডাডি সরবরাহিত ফাইল যুক্ত করার পরে SSLCertificateChainFileনোড এইচটিটিপিএসের সাথে সংযোগ করতে সক্ষম হয়েছিল এবং ত্রুটিটি চলে গেছে।


0

আপনাকে আপনার সার্ভারে অন্তর্বর্তী শংসাপত্র অন্তর্ভুক্ত করতে হবে। এটি [ত্রুটি: UNABLE_TO_VERIFY_LEAF_SIGNATURE] সমাধান করে


0

এটি নিরাপদে সমাধানের জন্য আরেকটি পদ্ধতির হ'ল নিম্নলিখিত মডিউলটি ব্যবহার করা।

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

দ্রষ্টব্য: আমি উপরের মডিউলটির লেখক।


0

আপনি যদি এই থ্রেডে আসেন কারণ আপনি নোড পোস্টগ্রিজ / পিজি মডিউল ব্যবহার করছেন, সেটিংয়ের চেয়ে আরও ভাল সমাধান রয়েছে NODE_TLS_REJECT_UNAUTHORIZEDবা rejectUnauthorizedযা অনিরাপদ সংযোগের দিকে পরিচালিত করবে।

পরিবর্তে, tls.con সংযোগের জন্য পরামিতিগুলির সাথে মেলে "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


0

নিম্নলিখিত কমান্ডগুলি আমার পক্ষে কাজ করেছে:

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

সমস্যাটি হ'ল আপনি কোনও খারাপ বা অবিশ্বস্ত এসএসএল [সিকিউর সকেট স্তর] শংসাপত্র সহ একটি সংগ্রহস্থল থেকে একটি মডিউল ইনস্টল করার চেষ্টা করছেন। আপনি একবার ক্যাশে পরিষ্কার করলে, এই সমস্যাটি সমাধান হয়ে যাবে You আপনাকে পরে এটি সত্যে পরিণত করার প্রয়োজন হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.