Request: 错误:DEPTH_ZERO_SELF_SIGNED_CERT

创建于 2013-01-22  ·  51评论  ·  资料来源: request/request

我在我的 apache2 服务器中使用自签名测试证书,当我调用 request 时,我收到以下错误:

错误:DEPTH_ZERO_SELF_SIGNED_CERT

我正在使用下面的代码来测试它。 请注意,我还使用针头,并将其与rejectUnauthorized = true选项。 我找不到应要求的等效项(我尝试过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.connect @port , @target , {rejectUnhauthorized : false}, =>
@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 对我有用,但 rejectUnauthorized: false 不行。
使用节点 v0.10.1

@dankohn@cliffano +1 在此处提供您的建议。

@case NODE_TLS_REJECT_UNAUTHORIZED 只是根据https://github.com/joyent/node/pull/4023恢复旧行为(允许无效和自签名证书)的逃生舱口,所以这只是我获得自我的一种解决方法-签署的证书工作。
所以它看起来像 rejectUnauthorized: false 没有做它应该做的事情。

我们知道,在许多情况下, {rejectUnauthorized:false}有效,而在其他一些情况下,它似乎不会传播到核心。 需要回答的问题是“是否存在请求未正确设置此选项的边缘情况,或者核心在某些边缘情况下未正确观察该选项?”

我需要一个完全可重复的测试来回答这个问题。

不幸的是,我没有测试用例,但这可能会有所帮助:

  • 我正在与之交谈的服务器出于某种原因需要 SSLv3( python 代码供参考;我在 Node 中看到了同样的错误)
  • 这就是我强制 SSLv3 的方式(我在请求中找不到方法): https.globalAgent.options.secureProtocol = 'SSLv3_method';

大家好,

感谢所有在图书馆工作的人。 我试图使用自签名证书进行一些测试并得到相同的错误。 我在下面提供了详细信息。 需要帮助请叫我。 我已经尝试了使用strictSSL 和rejectUnauthorized 的所有组合,但它似乎不起作用。

节点版本: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仍然不起作用,我仍然必须使用这个 hack:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

这很难看,因为我想检查有效性并接受自签名证书。

在编写测试时发现问题,但无法复制。

有一个有趣的发生这个问题。 设置strictSSL: false,它在一个盒子上有效,但在另一个盒子上无效(rejectUnauthorized=false 也失败了)。 @dankohn的建议奏效了。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

也适用于restler。

我能够使用rejectUnauthorized: false (node v0.10.26) 让它工作

我知道已关闭并合并
但也许值得一提的是:
一些 3rd 方库仍然依赖于请求和使用没有rejectUnauthorized: false

这仍然是一个问题吗?

这太旧了,我要关闭了,如果它实际上仍然是一个问题,请告诉我,我会重新打开。

这对我来说仍然是一个问题

节点 0.10.31 / 请求:2.42.0

屏幕截图: http :

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你认为这个“技巧”应该在文档中吗?

是的,我们可以使用一些文档和测试来解决像这样和 #811 这样的 SSL 问题。 应包括接受所有证书和仅接受所需的证书。

@syzer可能吗? 好吧,至少我发现它很有用

对我来说仍然是一个问题,v0.10.22。

@dankohn@cliffano你把 "NODE_TLS_REJECT_UNAUTHORIZED" : "0" 放在哪里了?

这是我的代码(它不起作用):
var soap = require('soap');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {电子邮件: '[email protected] ',
soap.createClient(网址,{“NODE_TLS_REJECT_UNAUTHORIZED”:“0”},功能(错误,客户端){
client.myOperation(args, function(err, result) {
控制台日志(错误,结果);
});
});

把它放在文件的顶部:

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

Dan Kohn邮箱:[email protected]
电话:+1-415-233-1000

在 2014 年 10 月 9 日星期四上午 11:41,Thanh [email protected]写道:

@dankohn https://github.com/dankohn , @cliffano
https://github.com/cliffano你把
“NODE_TLS_REJECT_UNAUTHORIZED”:“0”在?

这是我的代码(它不起作用):
var soap = require('soap');
var url = ' https://link.to/my/url/file.wsdl ';
变参= {电子邮件: ' [email protected] ',从此开始: 'passwort123',deviceMac:
'00-14-22-01-23-45'};
soap.createClient(网址,{“NODE_TLS_REJECT_UNAUTHORIZED”:“0”},
功能(错误,客户端){
client.myOperation(args, function(err, result) {
控制台日志(错误,结果);
});
});


直接回复此邮件或在 GitHub 上查看
https://github.com/mikeal/request/issues/418#issuecomment -58528954。

@dankohn :我仍然收到相同的错误消息。 我的代码现在看起来像这样:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var soap = require('soap');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {电子邮件: '[email protected] ',
soap.createClient(url, {rejectUna uthorized :false }, function(err, client) {
client.myOperation(args, function(err, result) {
控制台日志(错误,结果);
});
});

@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";

您还需要这方面的帮助吗?

请注意,Request 的2.45.0版本允许您将strictSSL为 false,然后rejectUnauthorized变为 false。

但是,如果您没有将strictSSL指定为 false,则rejectUnauthorized默认为undefined
我假设那是所需的行为。

@seanstrom

我不记得我做的例子,但它类似于@fourq 的例子

request.defaults(
严格的SSL:假
拒绝未授权:假)

自从使用“技巧”以来,我没有遇到任何问题

@弗兰克福
基于@fourq的例子,我想出了上面的这个解决方案。
https://github.com/mikeal/request/issues/418#issuecomment -58959393

你能看一下,看看这对你有用吗?

请注意,Request 2.45.0 版允许您只将strictSSL 设置为false,然后rejectUnauthorized 也变为false。

wfm 是在没有拒绝未授权的情况下之前失败的地方。

@andig我的聊天术语有点模糊,所以我只是确认你在说:
使用strictSSL: false对你有用
正确的?

@andig我的聊天术语有点模糊,所以我只是确认你在说:

@seanstrom请原谅幼稚的语言。

使用 strictSSL: false 对您有用。 正确的?

正确的。 我之前失败的 SSL 连接需要 rejectUnauthorized: false 现在只使用 strictSSL: false 。

我将关闭这个问题
如果这对任何人来说仍然是个问题,我会重新打开它。
让我知道

这里仍然是一个问题 v10.0.32
尝试 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" 时;
我得到:
_stream_readable.js:748
throw new Error('现在无法切换到旧模式。');

@webduvet你能给我们一个代码示例吗?
这将帮助我们调试这个问题

@seanstrom当然,这是来自 nodejs 文档的非常简单的示例。

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
 var tls = require('tls');
 var fs = require('fs');
变量选项 = {
 证书:fs.readFileSync('test-cert.pem'),
 严格的SSL:假
 };
 var cleartextStream = tls.connect(8000, options, function() {
 console.log('客户端连接',
 cleartextStream.authorized ? '授权' : '未授权');
 process.stdin.pipe(cleartextStream);
 process.stdin.resume();
 });

@seanstrom在尝试使用自签名证书时仍然遇到此错误。

事情是,rejectUnauthorized: false 关闭所有验证,对吗? 因为即使我不提供 PEM 或密钥或可接受的证书列表,它也能工作。 我需要提供证书(或密钥)并让请求引擎支持实际检查证书列表。

是的, rejectUnauthorized: falsestrictSSL: false不是理想的解决方案,因为它们关闭了所有证书验证。 不过,可以为自签名或无法识别的证书添加您自己的 CA。 查看我们的 HTTPS 测试,了解如何执行此操作的示例: https :

谢谢,尼伦。 该测试有助于澄清我们做错了什么。 我们使用的是自签名证书,而不是首先创建一个自签名 CA,然后使用该 CA 来签署服务器证书。 那是我以为我们在做的,但我们没有。

对于那些希望了解原理的人。

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 然后将您的请求添加到 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 它会起作用 inshaa Allah

你好呀,

我面临类似的问题,但仅在“POST”方法中,而“GET”工作正常。 以下是详细信息:

测试代码:

`
var frisby = require('frisby');
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

var CONF = process.env['CONF'];
var config = require('../config/' + CONF);
var data = require('../tests_data/batch_data.json');

frisby.globalSetup({
要求: {
严格的SSL:假,
拒绝未授权:假,
标头:{'授权':'令牌'},
检查失败:真
}
});

frisby.create('测试#1:晴天场景')
.post(config.api_url + data.api_endpoint, data.test_strace, {rejectUnauthorized: 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 = false;

此页面是否有帮助?
0 / 5 - 0 等级