我在我的 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);
}
});
同样的问题在这里。 使用节点 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}
有效,而在其他一些情况下,它似乎不会传播到核心。 需要回答的问题是“是否存在请求未正确设置此选项的边缘情况,或者核心在某些边缘情况下未正确观察该选项?”
我需要一个完全可重复的测试来回答这个问题。
不幸的是,我没有测试用例,但这可能会有所帮助:
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
这仍然是一个问题吗?
这太旧了,我要关闭了,如果它实际上仍然是一个问题,请告诉我,我会重新打开。
这对我来说仍然是一个问题
屏幕截图: 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: false
或strictSSL: 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;
最有用的评论
rejectUnauthorized: false
对我不起作用。 相反,添加以下内容消除了错误: