Request: خطأ: DEPTH_ZERO_SELF_SIGNED_CERT

تم إنشاؤها على ٢٢ يناير ٢٠١٣  ·  51تعليقات  ·  مصدر: request/request

أنا أستخدم شهادات اختبار موقعة ذاتيًا في خادم apache2 الخاص بي وعندما أتصل بالطلب أحصل على الخطأ التالي:

خطأ: DEPTH_ZERO_SELF_SIGNED_CERT

أنا أستخدم الكود التالي أدناه لاختباره. لاحظ أنني أستخدم إبرة أيضًا وتعمل مع خيار رفض Unauthorized = صحيح . لم أتمكن من العثور على مكافئ عند الطلب (لقد جربت strictSSL = false ولكني أعتقد أن هذا هو

var request = require('request'),
    needle = require('needle');

request('https://127.0.0.1', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log("REQUEST:"+body);
  } else {
    console.error("REQUEST: "+error)
  }
});

needle.get('https://127.0.0.1',{rejectUnauthorized:false},function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log("NEEDLE:"+body);
  }
});

التعليق الأكثر فائدة

rejectUnauthorized: false لم يعمل معي. بدلاً من ذلك ، أدت إضافة ما يلي إلى إزالة الخطأ:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" // Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs

ال 51 كومينتر

نفس المشكلة هنا. باستخدام العقدة v0.10.1 وأحدث إصدار طلب.

نفس المشكلة هنا باستخدام v0.10.2

نفس المشكلة في الإصدار v0.11.1-pre. أحتاج إلى قبول الشهادات غير الصالحة لأنني أقوم بتطوير أداة أمان.

client = tls.connectport،target، {rejectUnhauthorized: كاذبة}، =>
@ client.write الرسالة
@ client.setEncoding "utf-8"

الكود الذي تحتاجه هو:

request({ url : 'https://127.0.0.1', rejectUnhauthorized : false }, function...

تحرير: أزلت التعليق الأعرج الذي أدليت به ، لأن هذا مجرد أعرج مني ....

rejectUnauthorized: false

rejectUnauthorized: false لم يعمل معي. بدلاً من ذلك ، أدت إضافة ما يلي إلى إزالة الخطأ:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" // Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs

يمكنني التحقق من أن NODE_TLS_REJECT_UNAUTHORIZED = 0 مناسب لي ، لكن رفض غير مصرح به: خطأ لا يعمل.
باستخدام العقدة v0.10.1

dankohn & cliffano +1 لاقتراحاتكم هنا.

case NODE_TLS_REJECT_UNAUTHORIZED ليست سوى فتحة هروب للعودة إلى السلوكيات القديمة (السماح بشهادات غير صالحة وموقعة ذاتيًا) وفقًا لـ https://github.com/joyent/node/pull/4023 ، لذا فهي مجرد حل بديل بالنسبة لي للحصول على الذات شهادة العمل الموقعة.
لذلك يبدو أن رفض غير مصرح به: الخطأ لا يعني القيام بما يفترض أن يفعله.

نحن نعلم أنه في كثير من الحالات ، يعمل {rejectUnauthorized:false} وفي حالات أخرى يبدو أنه لا ينتشر إلى النواة. السؤال الذي يحتاج إلى إجابة هو "هل هناك حالة استثنائية حيث لا يقوم الطلب بتعيين هذا الخيار بشكل صحيح أو لا يراقب الأساسي الخيار بشكل صحيح في بعض حالات الحافة؟"

أحتاج إلى اختبار قابل للتكرار بالكامل للإجابة على هذا السؤال.

لسوء الحظ ، ليس لدي حالة اختبار ، ولكن قد يكون هذا مفيدًا:

  • يتطلب الخادم الذي أتحدث إليه SSLv3 لسبب ما ( رمز Python كمرجع ؛ كنت أرى نفس الخطأ في Node)
  • هذه هي الطريقة التي أجبر بها SSLv3 (وهو ما لم أجد طريقة للقيام به في الطلب): https.globalAgent.options.secureProtocol = 'SSLv3_method';

مرحبا شباب،

شكرا لكل من يعمل في المكتبة. كنت أحاول استخدام شهادة موقعة ذاتيًا لبعض الاختبارات والحصول على نفس الخطأ. لقد قمت بتضمين التفاصيل أدناه. اسمحوا لي أن أعرف إذا كنت بحاجة إلى أي شيء آخر. لقد جربت جميع مجموعات استخدام strictSSL و رفض غير مصرح به ولكن لا يبدو أنه يعمل.

إصدار العقدة: 0.10.10
نظام التشغيل: Windows 7 x64
OpenSSL: Win32 1.0.1e
تم إنشاء الشهادة باستخدام:
openssl genrsa –out priv.pem 1024
openssl req -x509 -new -key priv.pem -days 3650 -out cert.crt

كود لإنشاء الخادم

var https = require('https');
var express = require('express');
var app = express();
var credentials = {
    key: fs.readFileSync(__dirname + '/priv.pem', 'utf8'),
    cert: fs.readFileSync(__dirname + '/cert.crt', 'utf8')
};
var server = https.createServer(credentials, app);
server.listen(3000);

باستخدام طلب مثل ذلك:

var request = require('request');
request.defaults({
    strictSSL: false, // allow us to use our self-signed cert for testing
    rejectUnauthorized: false
});
request('https://localhost:3000', function(err) {
    console.error(err); // outputs the zero_depth error
});

dankohn عملت لي

مع [email protected] و nodejs v0.10.15 rejectUnauthorized: false لا يزال يتعطل ، لا يزال يتعين علي استخدام هذا الاختراق:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

وهو أمر قبيح ، لأنني أرغب في التحقق من الصلاحية وقبول الشهادات الموقعة ذاتيًا.

تم العثور على المشكلة أثناء كتابة اختبار ولكن تعذر تكرارها.

كان حدث مثير للاهتمام لهذه المشكلة. تعيين StrictSSL: false ، والتي عملت في مربع واحد ولكن ليس في مربع آخر (رفض Unauthorized = false فشل أيضًا). نجح اقتراح

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ،

يعمل لمصلح كذلك.

تمكنت من تشغيله باستخدام rejectUnauthorized: false (العقدة v0.10.26)

أعلم أنه مغلق ومدمج
ولكن ربما جدير بالذكر أن:
لا تزال بعض الليبونات الطرف الثالث تعتمد على الطلب والاستخدام بدون rejectUnauthorized: false

لا تزال هذه القضية؟

هذه مشكلة قديمة جدًا أنا أغلقها ، إذا كانت لا تزال تمثل مشكلة في الواقع ، فأخبرني بذلك وسأعيد فتحها.

هذا لا يزال يمثل مشكلة بالنسبة لي

العقدة 0.10.31 / الطلب: 2.42.0

لقطة الشاشة: http://screencast.com/t/hcmHPBlxOHc

request.defaults(
  strictSSL: false # allow us to use our self-signed cert for testing
  rejectUnauthorized: false)

request "https://localhost:8000/index.html", (err, res, body) ->
  return console.error err if err # DEPTH_ZERO_SELF_SIGNED_CERT

ما زلت أواجه مشكلة مع هذا أيضًا ، v0.10.20

باستخدام process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ؛ خدعة الآن

@ frankfuu هل تعتقد أن هذه "الحيلة" يجب أن تكون في التوثيق؟

نعم ، يمكننا استخدام بعض المستندات والاختبارات لمشكلات SSL مثل هذا و # 811. يجب أن يتضمن قبول جميع الشهادات وقبول الشهادات المطلوبة فقط.

syzer ربما؟ حسنًا على الأقل وجدته مفيدًا

لا تزال مشكلة بالنسبة لي ، v0.10.22.

dankohn ، cliffano أين وضعت "NODE_TLS_REJECT_UNAUTHORIZED": "0" في؟

هذا هو الكود الخاص بي (لا يعمل):
صابون فار = يتطلب ('صابون') ؛
var url = ' https://link.to/my/url/file.wsdl ' ؛
var args = {Email: ' [email protected]
soap.createClient (url ، {"NODE_TLS_REJECT_UNAUTHORIZED": "0"} ، الوظيفة (err ، العميل) {
client.myOperation (args، function (err، نتيجة) {
console.log (يخطئ ، نتيجة) ؛
}) ؛
}) ؛

ضعه أعلى الملف مباشرة:

// Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs.
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

دان كون mailto: [email protected]
هاتف: + 1-415-233-1000

في الخميس ، 9 أكتوبر 2014 الساعة 11:41 صباحًا ، كتب Thanh [email protected] :

dankohn https://github.com/dankohn،cliffano
https://github.com/cliffano أين وضعت ملف
"NODE_TLS_REJECT_UNAUTHORIZED": "0" في؟

هذا هو الكود الخاص بي (لا يعمل):
صابون فار = يتطلب ('صابون') ؛
var url = ' https://link.to/my/url/file.wsdl ' ؛
var args = {Email: ' [email protected]
'00 -14-22-01-23-45 '} ؛
soap.createClient (url، {"NODE_TLS_REJECT_UNAUTHORIZED": "0"}،
وظيفة (يخطئ ، عميل) {
client.myOperation (args، function (err، نتيجة) {
console.log (يخطئ ، نتيجة) ؛
}) ؛
}) ؛

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/mikeal/request/issues/418#issuecomment -58528954.

dankohn : ما زلت أحصل على نفس رسالة الخطأ. يبدو الرمز الخاص بي هكذا الآن:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ،
صابون فار = يتطلب ('صابون') ؛
var url = ' https://link.to/my/url/file.wsdl ' ؛
var args = {Email: ' [email protected]
soap.createClient (url، {رفضUna uthorized : false }، function (err، client) {
client.myOperation (args، function (err، نتيجة) {
console.log (يخطئ ، نتيجة) ؛
}) ؛
}) ؛

apiton : هل يمكنك حلها بالفعل؟ ما زلت أعاني من نفس المشكلة.

عنوان URL الخاص بي لا يبدأ بـ " https: // www. " ولكن " https: // link. " هل يمكن أن تكون هذه هي المشكلة؟

jksdua المثال كان معتادًا وتمكنت من إعادة إنتاج الخطأ.

لحل مشكلة fourq و jksdua ، تريد القيام بذلك

var request = require('request');
var request = request.defaults({
  strictSSL: false,
  rejectUnauthorized: false
});

أو

var request = require('request').defaults({
  strictSSL: false,
  rejectUnauthorized: false
});

ستعيد الطريقة defaults دالة.
لذلك تحتاج إلى تخصيص المتغير request للوظيفة حتى تعمل الخيارات الافتراضية.

وكذلك frankfuu ، هل يمكنك تقديم مثال لكيفية استخدامك للطلب باستخدام الخيار rejectUnauthorized ؟

إذا كنت لا تزال تواجه مشكلات ، فأنا أرغب في الحصول على حالة اختبار أخرى.

thadeuszlay أعلم أنك طلبت المساعدة للتو في استخدام:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ،

هل لا تزال بحاجة إلى مساعدة مع هذا؟

إصدار الملاحظة 2.45.0 من Request يسمح لك فقط بتعيين strictSSL إلى false ، ثم يصبح rejectUnauthorized خطأ أيضًا.

ومع ذلك ، إذا لم تحدد strictSSL ليكون خطأ ، فسيتم تعيين rejectUnauthorized افتراضيًا على undefined .
أفترض أن هذا هو السلوك المطلوب.

مرحبا seanstrom

لا أتذكر المثال الذي قدمته ولكنه كان مشابهًا لما لدى @ fourq

request.defaults (
صارم SSL: خطأ
رفض غير مصرح به: خطأ)

لم أواجه أي مشاكل منذ استخدام "الحيلة"

تضمين التغريدة
بناءً على مثالfourq ، توصلت إلى هذا الحل أعلاه.
https://github.com/mikeal/request/issues/418#issuecomment -58959393

هل يمكنك إلقاء نظرة ومعرفة ما إذا كان ذلك سيعمل من أجلك؟

يسمح لك إصدار الملاحظة 2.45.0 من Request بتعيينrictSSL فقط إلى false ، ثم يصبح رفض رفض غير مصرح به خطأً أيضًا.

هل wfm حيث فشل من قبل دون رفض غير مصرح به.

إن لغة الدردشة الخاصة بي على فأنا فقط أؤكد أنك تقول:
استخدام strictSSL: false يعمل من أجلك
صيح؟

إن لغة الدردشة الخاصة بي على فأنا فقط أؤكد أنك تقول:

seanstrom أرجوك

استخدامrictSSL: false يعمل من أجلك. صيح؟

صيح. فشل اتصال SSL الذي أجريته سابقًا والذي تطلب رفضًا غير مصرح به: خطأ يعمل الآن مع strictSSL: false فقط.

سأغلق هذه القضية
إذا كانت هذه لا تزال مشكلة بالنسبة لأي شخص ، فسأعيد فتحه.
دعني أعلم

لا تزال مشكلة هنا v10.0.32
عند محاولة process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ؛
انا حصلت:
_stream_readable.js: 748
طرح خطأ جديد ("لا يمكن التبديل إلى الوضع القديم الآن.") ؛

webduvet هل يمكنك أن تعطينا عينة رمز؟
سيساعدنا ذلك في تصحيح هذه المشكلة

seanstrom بالتأكيد ، لقد كانت عينة بسيطة جدًا من nodejs doc.

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ،
 var tls = تتطلب ('tls') ؛
 var fs = تتطلب ('fs') ؛
 خيارات var = {
 cert: fs.readFileSync ('test-cert.pem') ،
 صارم SSL: خطأ
 } ؛
 var cleartextStream = tls.connect (8000 ، خيارات ، الوظيفة () {
 console.log ("العميل متصل"،
 cleartextStream. مصرح به؟ "مخول": "غير مصرح به") ؛
 process.stdin.pipe (cleartextStream) ؛
 process.stdin.resume () ،
 }) ؛

seanstrom ما زلت أتلقى هذا الخطأ عند محاولة استخدام

الشيء هو ، رفض غير مصرح به: خطأ يؤدي إلى إيقاف تشغيل جميع عمليات التحقق ، أليس كذلك؟ لأنه يعمل حتى إذا لم أقدم PEM أو مفتاحًا أو قائمة بالشهادات التي يمكن قبولها. أحتاج إلى تقديم شهادة (أو مفتاح) وجعل دعم محرك الطلب يتحقق بالفعل من قائمة الشهادة.

نعم ، لا يُعد rejectUnauthorized: false أو strictSSL: false حلين مثاليين لأنهما يوقفان جميع عمليات التحقق من الشهادات. من الممكن إضافة المراجع المصدقة (CA) الخاصة بك للشهادات الموقعة ذاتيًا أو غير المعترف بها. ألق نظرة على اختبارات HTTPS الخاصة بنا للحصول على مثال لكيفية القيام بذلك: https://github.com/request/request/blob/master/tests/test-https.js

شكرا نيلن. ساعد هذا الاختبار في توضيح الخطأ الذي ارتكبناه. كنا نستخدم شهادات موقعة ذاتيًا ، بدلاً من إنشاء مرجع مصدق موقعة ذاتيًا أولاً ثم استخدام المرجع المصدق هذا للتوقيع على شهادة الخادم. هذا ما اعتقدت أننا نفعله ، لكننا لم نكن كذلك.

بالنسبة لأولئك الذين يرغبون في فهم مبدأ.

https://nodejs.org/dist/v0.12.9/docs/api/tls.html#tls_tls_connect_options_callback

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "1";
var tls = require('tls');
var fs = require('fs');
var constants = require('constants');
var util = require('util');

var options = {
    host: 'localhost',
    strictSSL: true,
    ca: [fs.readFileSync('trusted1.pem'), fs.readFileSync('trusted2.pem') ],
    rejectUnauthorized: true, // Trust to listed certificates only. Don't trust even google's certificates.
    secureOptions: constants.SSL_OP_NO_SSLv3 | constants.SSL_OP_NO_SSLv2 | constants.SSL_OP_NO_TLSv1 | constants.SSL_OP_NO_TLSv1_1,
    secureProtocol: 'SSLv23_method',
    ciphers: 'ECDHE-RSA-AES128-SHA256'
};

var socket = tls.connect(3001, options, function() {
    console.log('client connected',
        socket.authorized ? 'authorized' : 'unauthorized',
        socket.encrypted ? 'encrypted' : 'unencrypted',
        '\nCipher: ' + util.inspect(socket.getCipher()),
        '\nCert Info: \n' + util.inspect(socket.getPeerCertificate(true)));
    //process.stdin.pipe(socket);
    //process.stdin.resume();
});

في الحقيقة يبدو أن كل مشاكلك هي أن نظام العميل الخاص بك لا يحتوي على تكوين شهادة SSL
قم أولاً بتكوين نظامك openSsl ands ثم أضف طلبك سواء تم الحصول عليه أو نشره للمعالجة .env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ؛ ستعمل إن شاء الله

أهلا،

أواجه مشكلة مماثلة ولكن فقط في طريقة "POST" بينما تعمل "GET" بشكل جيد. فيما يلي المعلومات التفصيلية:

كود الاختبار:

"
var frisby = يتطلب ('frisby') ؛
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" ،

var CONF = process.env ['CONF'] ؛
var config = يتطلب ('../ config /' + CONF) ؛
var data = يتطلب ('../ tests_data / batch_data.json') ؛

frisby.globalSetup ({
طلب: {
صارم SSL: خطأ ،
رفض غير مصرح به: خطأ ،
الرؤوس: {'Authorization': 'token'}،
inspectOnFailure: صحيح
}
}) ؛

frisby.create ("اختبار رقم 1: سيناريو يوم مشمس")
.post (config.api_url + data.api_endpoint، data.test_strace، {رفضUnauthorized: false}، {json: true})
.inspectHeaders ()
.inspectRequest ()
.inspectJSON ()
.expectJSON (data.batch_test_response_1)
.رمى()؛
"

خطأ في التنفيذ:
خطأ -1
Message: Error: Error parsing JSON string: Unexpected token D Given: Destination URL may be down or URL is invalid, Error: ESOCKETTIMEDOUT Stacktrace: Error: Error parsing JSON string: Unexpected token D Given: Destination URL may be down or URL is invalid, Error: ESOCKETTIMEDOUT at _jsonParse (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:1219:11) at null.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:650:20) at null.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:1074:43) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

خطأ 2

Message: TypeError: Cannot read property 'headers' of undefined Stacktrace: TypeError: Cannot read property 'headers' of undefined at Frisby.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:894:20) at Frisby.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:940:8) at null.<anonymous> (/usr/src/app/frisby_api/node_modules/frisby/lib/frisby.js:1112:18) at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

ما الذي يجب تحديثه هنا لإصلاح هذه المشكلات؟

شكرا

أضف هذا ويجب أن يحلها:

https.globalAgent.options.rejectUnauthorized = خطأ ،

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات