Request: Erro: DEPTH_ZERO_SELF_SIGNED_CERT

Criado em 22 jan. 2013  ·  51Comentários  ·  Fonte: request/request

Estou usando certificados de teste autoassinados em meu servidor apache2 e quando ligo para a solicitação, recebo o seguinte erro:

Erro: DEPTH_ZERO_SELF_SIGNED_CERT

Estou usando o seguinte código abaixo para testá-lo. Observe que também estou usando agulha e ele funciona com a opção rejeitarUnauthorized = true . Não consegui encontrar um equivalente a pedido (tentei strictSSL = false, mas acho que é o padrão). Não consegui encontrar nenhuma outra amostra relacionada ao problema.

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

Comentários muito úteis

rejectUnauthorized: false não funcionou para mim. Em vez disso, adicionar o seguinte removeu o erro:

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

Todos 51 comentários

Mesmo problema aqui. Usando o nó v0.10.1 e a versão de solicitação mais recente.

mesmo problema aqui usando v0.10.2

O mesmo problema na v0.11.1-pré. Preciso aceitar certificados inválidos porque estou desenvolvendo uma ferramenta de segurança.

@client = tls.connect @port , @target , {rejeitarUnhauthorizado: falso}, =>
mensagem @ client.write
@ client.setEncoding 'utf-8'

O código de que você precisa é:

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

Edit: Removi o comentário coxo que fiz, porque isso é simplesmente coxo da minha parte ....

rejectUnauthorized: false

rejectUnauthorized: false não funcionou para mim. Em vez disso, adicionar o seguinte removeu o erro:

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

Posso verificar se NODE_TLS_REJECT_UNAUTHORIZED = 0 funciona para mim, mas rejeitarUnauthorized: false não.
Usando o nó v0.10.1

@dankohn & @cliffano +1 por suas sugestões aqui.

@case NODE_TLS_REJECT_UNAUTHORIZED é apenas uma saída para reverter para comportamentos antigos (permitindo certificados inválidos e autoassinados) de acordo com https://github.com/joyent/node/pull/4023 , então é apenas uma solução alternativa para eu me recuperar -assinado cert trabalhando.
Portanto, parece rejeitarUnauthorized: false não é fazer o que deveria estar fazendo.

Sabemos que, em muitos casos, {rejectUnauthorized:false} funciona e em alguns outros parece não se propagar para o núcleo. A pergunta que precisa ser respondida é "há um caso extremo em que a solicitação não define essa opção corretamente ou o núcleo não observa a opção corretamente em alguns casos extremos?"

Preciso de um teste totalmente reproduzível para responder a essa pergunta.

Infelizmente, não tenho um caso de teste, mas isso pode ser útil:

  • o servidor com o qual estou falando requer SSLv3 por algum motivo ( código Python para referência ; estava vendo o mesmo erro no Node)
  • é assim que estou forçando SSLv3 (o que não consegui encontrar uma maneira de fazer na Solicitação): https.globalAgent.options.secureProtocol = 'SSLv3_method';

Ei pessoal,

Obrigado a todos que trabalham na biblioteca. Eu estava tentando usar um certificado autoassinado para alguns testes e obtive o mesmo erro. Incluí detalhes abaixo. Avise-me se precisar de mais alguma coisa. Eu tentei todas as combinações de uso de strictSSL e rejeitarUnauthorized, mas não parece funcionar.

Versão do nó: 0.10.10
SO: Windows 7 x64
OpenSSL: Win32 1.0.1e
Cert gerado usando:
openssl genrsa –out priv.pem 1024
openssl req -x509 -new -key priv.pem -days 3650 -out cert.crt

Código para criar servidor

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

Usando solicitação assim:

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 trabalhou para mim

Com [email protected] e nodejs v0.10.15 rejectUnauthorized: false ainda não funcionando, eu ainda tenho que usar este hack:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

O que é feio, porque gostaria de verificar a validade e aceitar certificados autoassinados.

Encontrou o problema ao escrever um teste, mas não foi possível replicar.

Teve uma ocorrência interessante desse problema. Defina strictSSL: false, que funcionou em uma caixa, mas não em outra (rejeitarUnauthorized = false também falhou). A sugestão de @dankohn funcionou.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

Funciona para restler também.

Consegui fazê-lo funcionar usando rejectUnauthorized: false (node ​​v0.10.26)

eu sei que está fechado e mesclado
mas talvez valha a pena mencionar que:
algumas bibliotecas de terceiros ainda dependem de solicitação e usam sem rejectUnauthorized: false

Isso ainda é um problema?

Isso é tão antigo que estou fechando, se ainda for um problema, é só me avisar e eu reabrirei.

Isso ainda é um problema para mim

nó 0.10.31 / solicitação: 2.42.0

captura de tela: 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

Ainda estou tendo problemas com isso, v0.10.20

Usando o process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; truque por agora

@frankfuu você acha que este 'truque' deveria estar na documentação?

Sim, poderíamos usar alguns documentos e testes para problemas de SSL como este e # 811. Deve incluir aceitar todos os certificados e aceitar apenas os certificados desejados.

@syzer possivelmente? bem, pelo menos eu achei útil

Ainda é um problema para mim, v0.10.22.

@dankohn , @cliffano onde você colocou "NODE_TLS_REJECT_UNAUTHORIZED": "0" em?

Este é o meu código (não funciona):
var sabão = requer ('sabão');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {Email: ' [email protected] ', Senha: 'passwort123', deviceMac: '00 -14-22-01-23-45 '};
soap.createClient (url, {"NODE_TLS_REJECT_UNAUTHORIZED": "0"}, função (err, cliente) {
client.myOperation (args, function (err, result) {
console.log (errar, resultado);
});
});

Coloque-o bem no topo do arquivo:

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

Dan Kohn mailto: [email protected]
tel .: + 1-415-233-1000

Na quinta-feira, 9 de outubro de 2014 às 11h41, Thanh [email protected] escreveu:

@dankohn https://github.com/dankohn , @cliffano
https://github.com/cliffano onde você colocou o
"NODE_TLS_REJECT_UNAUTHORIZED": "0" em?

Este é o meu código (não funciona):
var sabão = requer ('sabão');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {Email: ' [email protected] ', Senha: 'passwort123', deviceMac:
'00 -14-22-01-23-45 '};
soap.createClient (url, {"NODE_TLS_REJECT_UNAUTHORIZED": "0"},
função (err, cliente) {
client.myOperation (args, function (err, result) {
console.log (errar, resultado);
});
});

-
Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/mikeal/request/issues/418#issuecomment -58528954.

@dankohn : Ainda recebo a mesma mensagem de erro. Meu código está assim agora:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var sabão = requer ('sabão');
var url = ' https://link.to/my/url/file.wsdl ';
var args = {Email: ' [email protected] ', Senha: 'passwort123', deviceMac: '00 -14-22-01-23-45 '};
soap.createClient (url, {rejeitarUna uthorized: false }, function (err, client) {
client.myOperation (args, function (err, result) {
console.log (errar, resultado);
});
});

@apiton : Você já poderia resolver isso? Eu ainda tenho o mesmo problema.

meu URL não começa com " https: // www. ", mas " https: // link. ", será que este é o problema?

O exemplo

Para resolver o problema @fourq e @jksdua, você deve fazer isso

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

Ou

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

O método defaults retornará uma função.
Portanto, você precisa atribuir a variável request à função para que as opções padrão funcionem.

Além disso, @frankfuu pode fornecer um exemplo de como está usando a solicitação com a opção rejectUnauthorized ?

Se você ainda estiver tendo problemas, gostaria de obter outro caso de teste.

@thadeuszlay Sei que você acabou de pedir ajuda para usar:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

Você ainda precisa de ajuda com isso?

Observe que a versão 2.45.0 do Request permite que você apenas defina strictSSL como falso e, em seguida, rejectUnauthorized se torna falso.

No entanto, se você não especificar strictSSL como falso, rejectUnauthorized padroniza para undefined .
Estou assumindo que esse é o comportamento desejado.

Olá @seanstrom

Não me lembro do exemplo que fiz, mas era semelhante ao que @fourq tinha

request.defaults (
strictSSL: false
rejeitarUnauthorized: false)

Não tive problemas desde que usei "o truque"

@frankfuu
Baseado no exemplo de @fourq , eu vim com a solução acima.
https://github.com/mikeal/request/issues/418#issuecomment -58959393

Você pode dar uma olhada e ver se isso funcionaria para você?

Observe que a versão 2.45.0 de Request permite que você apenas defina strictSSL como falso e, em seguida, rejeitarUnauthorized também se torna falso.

É o wfm onde ele falhou antes, sem rejeitarUnauthorized.

@andig, meu jargão de bate-papo está um pouco confuso, então estou apenas confirmando que você está dizendo:
Usar strictSSL: false está funcionando para você
Correto?

@andig, meu jargão de bate-papo está um pouco confuso, então estou apenas confirmando que você está dizendo:

@seanstrom, por favor, perdoe a linguagem infantil.

O uso de strictSSL: false está funcionando para você. Correto?

Correto. Minha conexão SSL com falha anterior que exigia rejeitarUnauthorized: false agora está funcionando apenas com strictSSL: false.

Vou encerrar este assunto
Se isso ainda for um problema para alguém, vou reabri-lo.
Avise

ainda é um problema aqui v10.0.32
ao tentar process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
eu recebo:
_stream_readable.js: 748
lançar novo erro ('Não é possível alternar para o modo antigo agora.');

@webduvet você pode nos dar um exemplo de código?
Isso nos ajudará a depurar esse problema

@seanstrom claro, foi uma amostra muito simples do documento nodejs.

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
 var tls = requer ('tls');
 var fs = requer ('fs');
 var options = {
 cert: fs.readFileSync ('test-cert.pem'),
 strictSSL: false
 };
 var cleartextStream = tls.connect (8000, opções, função () {
 console.log ('cliente conectado',
 cleartextStream.authorized? 'autorizado': 'não autorizado');
 process.stdin.pipe (cleartextStream);
 process.stdin.resume ();
 });

@seanstrom Ainda estou recebendo este erro ao tentar usar

O problema é, rejeitarUnauthorized: false desativa todas as verificações, certo? Porque funciona mesmo se eu não fornecer um PEM ou chave ou lista de certificados aceitáveis. Preciso fornecer um certificado (ou chave) e fazer com que o suporte do mecanismo de solicitação realmente verifique a lista de certificados.

Sim, rejectUnauthorized: false ou strictSSL: false não são as soluções ideais porque desativam todas as verificações de certificado. No entanto, é possível adicionar suas próprias CAs para certificados autoassinados ou não reconhecidos. Dê uma olhada em nossos testes HTTPS para obter um exemplo de como fazer isso: https://github.com/request/request/blob/master/tests/test-https.js

Obrigado, Nylen. Esse teste ajudou a esclarecer o que estávamos fazendo de errado. Estávamos usando certificados autoassinados, em vez de primeiro criar um CA autoassinado e, em seguida, usar esse CA para assinar o certificado do servidor. Isso é o que pensei que estávamos fazendo, mas não estávamos.

Para quem deseja compreender um princípio.

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

realmente parece que todos os seus problemas são o seu sistema cliente não tem configuração de certificado SSL
primeiro configure seus sistemas openSsl ands e então adicione sua solicitação seja get ou post para process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; funcionaria inshaa Allah

Olá,

Estou enfrentando um problema semelhante, mas apenas no método "POST" enquanto "GET" está funcionando bem. Aqui estão as informações detalhadas:

Código de teste:

`
var frisby = requer ('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 ({
solicitar: {
strictSSL: falso,
rejeitarUnauthorized: false,
cabeçalhos: {'Autorização': 'token'},
inspectOnFailure: true
}
});

frisby.create ('Teste # 1: cenário de dia ensolarado')
.post (config.api_url + data.api_endpoint, data.test_strace, {rejeitarUnauthorized: false}, {json: true})
.inspectHeaders ()
.inspectRequest ()
.inspectJSON ()
.expectJSON (data.batch_test_response_1)
.sorteio();
`

Erro de execução:
Erro-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)

Erro-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)

O que deve ser atualizado aqui para corrigir esses problemas?

Obrigado

adicione isso e deve resolver:

https.globalAgent.options.rejectUnauthorized = false;

Esta página foi útil?
0 / 5 - 0 avaliações