Https.request সহ নোড.জেএসসে অবৈধ স্ব-স্বাক্ষরিত এসএসএল শংসাপত্র উপেক্ষা করুন?


308

আমি একটি ছোট অ্যাপ্লিকেশনটিতে কাজ করছি যা আমার স্থানীয় ওয়্যারলেস রাউটারে (লিংকসিস) লগ ইন করে তবে আমি রাউটারের স্ব-স্বাক্ষরিত এসএসএল শংসাপত্র নিয়ে একটি সমস্যায় পড়ছি into

আমি 192.168.1.1 উইজেট দৌড়ে এসেছি:

ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/emailAddress=support@linksys.com':
Self-signed certificate encountered.
ERROR: certificate common name `Linksys' doesn't match requested host name `192.168.1.1'.
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'.

নোডে, ত্রুটিটি ধরা পড়ার বিষয়টি হ'ল:

{ [Error: socket hang up] code: 'ECONNRESET' }

আমার বর্তমান নমুনা কোডটি হ'ল:

var req = https.request({ 
    host: '192.168.1.1', 
    port: 443,
    path: '/',
    method: 'GET'

}, function(res){

    var body = [];
    res.on('data', function(data){
        body.push(data);
    });

    res.on('end', function(){
        console.log( body.join('') );
    });

});
req.end();

req.on('error', function(err){
    console.log(err);
});

আমি "- কোন-চেক-শংসাপত্র" এর সমতুল্য নোড.জেএস পেতে কীভাবে যেতে পারি?

উত্তর:


599

সস্তা এবং নিরাপত্তাহীন উত্তর:

যোগ

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

কোড করার আগে, কল করার আগে https.request()

আরও একটি নিরাপদ উপায় (উপরের সমাধানটি পুরো নোড প্রক্রিয়াটিকে নিরাপত্তাহীন করে তোলে) এই প্রশ্নের উত্তর দেওয়া হয়েছে


2
আমার জন্য একটি কবজ মত কাজ! আমি আমার মূল অ্যাপ্লিকেশন জেএস এর একেবারে শীর্ষে সমস্ত কিছু অন্তর্ভুক্ত করার পরে এই কোডটি ঠিক রেখেছি।
এক্সেডিসিমাল

এটি নোডজেএস এবং সাইলজেএস কম্বোর পক্ষেও কাজ করেছে। আমি এটিকে স্থানীয়.জেএস এর শীর্ষে যুক্ত করেছি
মাইকেল কর্ক।

38
উত্পাদনের পরিবেশে এটি বা "অস্বীকৃতিজনিত" ব্যবহার করবেন না, কারণ এটি সমস্ত ধরণের সুরক্ষা চেক অক্ষম করে।
জেসন ওয়ালটন

3
আমার স্ব-স্বাক্ষরিত https নোড সার্ভারে মোচা ব্যবহার করে পরীক্ষা চালানোতে আমার সমস্যা হয়েছিল এবং কোনও বিবরণ ব্লক আমার পরীক্ষাগুলি পাস করার আগেই এটি যুক্ত করে।
artis3n

সমস্যাটি সমাধানের এটি সম্ভবত নিরাপদ উপায় নয়। স্ট্যাকওভারফ্লো.com
ম্যাট পেনিংটন

166

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

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },

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

2
এটি কাজ করার জন্য আপনাকে একটি কাস্টম এজেন্টের একটি স্পষ্ট উদাহরণ সরবরাহ করতে হবে। অপশন অবজেক্ট তৈরি করুন এবং এজেন্টটি সেট করুন: 'অপশনস.এজেন্ট = নতুন https. এজেন্ট (অপশনস);' তারপরে কেবল 'https.request (বিকল্প)' কল করুন
সর্বাধিক

14
ঠিক আছে, এটি আমার জন্য কেবল rejectUnauthorizedবিকল্প এবং অন্য কিছু নিয়ে কাজ করেছিল
mcont

@ এমকন্ট আমি নিশ্চিত করেছিলাম যে ওটব rejectUnauthorizedসবই যথেষ্ট ছিল। বনাম কোড এক্সটেনশনের মধ্যে ব্যবহার করা। আরও ভাল পিইএম কনফিগারেশনকে অনুমতি দিন, আমি এরপরে এটি করব ...
Escape-llc

60

যারা আপনাকে বিভ্রান্ত করার চেষ্টা করে তাদের সকলকে বিশ্বাস করবেন না।

আপনার অনুরোধে, কেবল যুক্ত করুন:

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]

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

তারপরে আপনি যা পাবেন তা হ'ল:

var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
      method: 'GET',
      rejectUnauthorized: true,
      requestCert: true,
      agent: false
    },

অনুগ্রহ করে বুঝতে অনুগ্রহ করে এই নিবন্ধটি (প্রকাশ: এই উত্তরের লেখকের লেখা ব্লগ পোস্ট) পড়ুন:

  • সিএ শংসাপত্রগুলি কীভাবে কাজ করে
  • উত্পাদন পরিবেশকে অনুকরণ করার জন্য কীভাবে সহজে পরীক্ষার জন্য সিএ সার্টেট তৈরি করা যায়

7
এটি কাজ করে এবং সমস্যাটি ঠিক করার সঠিক উপায় "ত্রুটি: শংসাপত্র শৃঙ্খলে স্ব স্বাক্ষরিত শংসাপত্র" "
রোহান রাশানে

1
আপনি কেন স্ট্রিং হিসাবে সংরক্ষণের পরিবর্তে বন্ধনীর মধ্যে fs.readFileSync রাখেন?
লেলো

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

53

নিম্নলিখিত পরিবেশের পরিবর্তনশীল যুক্ত করুন:

NODE_TLS_REJECT_UNAUTHORIZED=0

যেমন export:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(জুয়ানরাকে ধন্যবাদ জানাই)


এটি চালানোর চেষ্টা করার সময় আমার পক্ষে কাজ করেছিলwebdriver-manager update
অ্যাশলে

3
উইন্ডোগুলির জন্য NODE_TLS_REJECT_UNAUTHORIZED = 0 সেট করুন
ফিলিপ এসএস

এটি আমার দেব পরিবেশের জন্য দুর্দান্ত সমাধান ছিল
ডেভিড

14

@ আরমান্ড উত্তরে যুক্ত করা:

নিম্নলিখিত পরিবেশের পরিবর্তনশীল যুক্ত করুন:

NODE_TLS_REJECT_UNAUTHORIZED = 0 যেমন রফতানি সহ:

NODE_TLS_REJECT_UNAUTHORIZED = 0 রফতানি করুন (জুয়ানার ধন্যবাদ সহকারে)

আপনি যদি উইন্ডোজ ব্যবহারে থাকেন:

set NODE_TLS_REJECT_UNAUTHORIZED=0

ধন্যবাদ: @ ওয়েগল08


12

আপনি ডিফল্ট বিকল্পগুলির সাথে একটি অনুরোধ উদাহরণও তৈরি করতে পারেন:

require('request').defaults({ rejectUnauthorized: false })

3

MeteorJS এর ​​জন্য আপনি npmRequestOptions দিয়ে সেট করতে পারেন।

HTTP.post(url, {
    npmRequestOptions: {
        rejectUnauthorized: false // TODO remove when deploy
    },
    timeout: 30000, // 30s
    data: xml
}, function(error, result) {
    console.log('error: ' + error);
    console.log('resultXml: ' + result);
});

1

অথবা আপনি স্থানীয় নাম রেজোলিউশন ( বেশিরভাগ অপারেটিং সিস্টেমে hostsডিরেক্টরিতে পাওয়া ফাইল etc, বিশদ আলাদা) এর যোগ করার চেষ্টা করতে পারেন:

192.168.1.1 Linksys 

এবং পরবর্তী

var req = https.request({ 
    host: 'Linksys', 
    port: 443,
    path: '/',
    method: 'GET'
...

কাজ করবে.


3
সত্য যে এটি প্রশ্নের উত্তর দিতে পারে তবে আমি মনে করি যে পরবর্তী ত্রুটি এই ক্ষেত্রে DEPTH_ZERO_SELF_SIGNED_CERT হবে।
অলিভিয়ার এম্বল্ট

1
সুতরাং কেউ কীভাবে প্রায় DEPTH_ZERO_SELF_SIGNED_CERT পেতে পারে? আমি এখন এটি চালাচ্ছি।
রেজা

3
@ রেজা: এটি আপনার বিকল্পগুলিতে যুক্ত করুন:rejectUnauthorized: false
ওবা

1
আমি জানি এটি সামান্য পুরানো তবে ভবিষ্যতের রেফারেন্সের জন্য (এটি সঠিক উপায়ে করার জন্য) আপনাকে স্ব-স্বাক্ষরিত শংসাপত্রের একটি পিইএম-এনকোডিং পেতে হবে এবং সিএ হিসাবে বিকল্পগুলির মধ্যে এটি অন্তর্ভুক্ত করতে হবে (আপনার দৃশ্যত এটিও প্রয়োজন) এজেন্ট মান সেট করতে কিন্তু এটি মিথ্যা হতে পারে)। শংসাপত্রটি স্ব-স্বাক্ষরিত হওয়ায় এটি নিজস্ব সিএ হিসাবে কাজ করে এবং তাই এটি নিজে যাচাই করতে ব্যবহার করা যেতে পারে। তবে আমি এটিও জিজ্ঞাসা করব যে রাউটারে এটি করা কি সত্যই কার্যকর হবে যেহেতু ফার্মওয়্যারটি সম্ভবত ডাউনলোড করা যেতে পারে এবং তাই ব্যক্তিগত কীটি সহজেই আপস করা যেতে পারে।
জোনাথন গ্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.