Quando tento instalar um pacote com o npm, ele não funciona. Depois de uma longa espera, eventualmente recebo um erro 'não foi possível estabelecer o soquete de tunelamento, sutatusCode = 403'.
$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
npm ERR! at ClientRequest.onConnect (c:\Program Files\nodejs\node_modules\npm\node_modules\request\tunnel.js:148:19)
npm ERR! at ClientRequest.g (events.js:193:14)
npm ERR! at ClientRequest.EventEmitter.emit (events.js:123:20)
npm ERR! at Socket.socketOnData (http.js:1393:11)
npm ERR! at TCP.onread (net.js:403:27)
No entanto, quando eu navego para o mesmo URL no meu navegador (Google Chrome), ele carrega bem (consulte a nota de rodapé). https://registry.npmjs.org/coffee-script
O que há de errado?
Embora eu use um proxy https, tenho certeza de que esse não é o problema. Configurei a variável de ambiente https_proxy
(de acordo com o guia do usuário npm ). Eu sei que a variável de ambiente está correta, porque o gerenciador de pacotes Python a pip
segue corretamente.
Acredito que o problema esteja relacionado aos certificados SSL, porque se eu baixar esse URL com wget
, recebo um erro explícito sobre certificados
$ wget https://registry.npmjs.org/coffee-script
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = c:/progra~1/wget/etc/wgetrc
--2012-12-17 12:14:07-- https://registry.npmjs.org/coffee-script
Resolving corpproxy... 10.254.215.35
Connecting to corpproxy|10.254.215.35|:8080... connected.
ERROR: cannot verify registry.npmjs.org's certificate, issued by `/C=US/ST=CA/L=Oakland/O=npm/OU=npm Certificate Authority/CN=npmCA/[email protected]':
Unable to locally verify the issuer's authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.
Como posso consertar isso? Sem comprometer a segurança.
Eu costumava obter erros de certificado SSL em meu navegador da web também, até instalar o certificado 'npmCA' como uma 'autoridade de certificação raiz confiável' nas Opções de Internet do Painel de controle (captura de tela )
Editar: tentei uma solução alternativa insegura por https://npmjs.org/doc/config.html#strict-ssl
npm set strict-ssl false
No entanto, ainda atinge o tempo limite com o mesmo erro
$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
Respostas:
TL; DR - Basta executar e não desabilitar sua segurança:
Substituir certificados existentes
ou estender certificados existentes
Defina esta variável de ambiente para estender certificados predefinidos:
NODE_EXTRA_CA_CERTS
para"<path to certificate file>"
História completa
Tive que trabalhar com npm, pip, maven etc. atrás de um firewall corporativo no Windows - não é divertido. Tentarei manter esta plataforma agnóstica / ciente sempre que possível.
HTTP_PROXY e HTTPS_PROXY
HTTP_PROXY
&HTTPS_PROXY
são variáveis de ambiente usadas por muitos softwares para saber onde está o seu proxy. No Windows, muitos softwares também usam o proxy especificado do sistema operacional, o que é uma coisa totalmente diferente. Isso significa que você pode fazer com que o Chrome (que usa o proxy especificado nas Opções da Internet) se conecte à URL perfeitamente, mas npm, pip, maven etc. não funcionam porque usam HTTPS_PROXY (exceto quando usam HTTP_PROXY - veja mais tarde). Normalmente, a variável de ambiente seria semelhante a:Mas você está recebendo um 403 que sugere que você não está sendo autenticado no seu proxy. Se for uma autenticação básica no proxy, você desejará definir a variável de ambiente para algo no formato:
O temido NTLM
Há um código de status HTTP 407 (autenticação de proxy necessária), que é a maneira mais correta de dizer que é o proxy, e não o servidor de destino, que está rejeitando sua solicitação. Esse código me atormentou por muito tempo, até que depois de muito tempo no Google, descobri que meu proxy usava autenticação NTLM . A autenticação HTTP básica não era suficiente para satisfazer qualquer proxy que meus overlords corporativos tivessem instalado. Recorri ao uso do Cntlm em minha máquina local (não autenticado) e, em seguida, fiz com que ele tratasse da autenticação NTLM com o proxy upstream. Então eu tive que dizer a todos os programas que não podiam fazer NTLM para usar minha máquina local como o proxy - que geralmente é tão simples quanto configurar
HTTP_PROXY
eHTTPS_PROXY
. Caso contrário, para uso npm (como @Agus sugere):"Precisamos descriptografar todo o tráfego HTTPS por causa dos vírus"
Depois que essa configuração começou a funcionar (desajeitadamente) por cerca de um ano, os senhores supremos corporativos decidiram mudar o proxy. Não só isso, mas não usaria mais NTLM! Um admirável mundo novo com certeza. Mas, como os criadores de softwares mal-intencionados agora distribuíam malware via HTTPS, a única maneira de proteger os pobres usuários inocentes era interceptar todas as conexões para verificar se há ameaças antes mesmo que elas chegassem até nós. Como você pode imaginar, fui dominado pela sensação de segurança.
Para encurtar a história, o certificado autoassinado precisa ser instalado no npm para evitar
SELF_SIGNED_CERT_IN_CHAIN
:Como alternativa, a
NODE_EXTRA_CA_CERTS
variável de ambiente pode ser definida para o arquivo de certificado.Acho que é tudo que sei sobre como fazer o npm funcionar por trás de um proxy / firewall. Que alguém ache útil.
Editar : é uma sugestão muito comum para desligar o HTTPS para este problema usando um registro ou configuração HTTP
NODE_TLS_REJECT_UNAUTHORIZED
. Essas não são boas ideias porque você está se abrindo para mais ataques man-in-the-middle ou de redirecionamento. Uma rápida falsificação de seus registros DNS na máquina que está fazendo a instalação do pacote e você vai confiar em pacotes de qualquer lugar. Pode parecer muito trabalhoso fazer o HTTPS funcionar, mas é altamente recomendado. Quando você é o único responsável por permitir a entrada de código não confiável na empresa, entenderá por quê.Edição 2 : tenha em mente que a configuração
npm config set cafile <path>
faz com que o npm use apenas os certificados fornecidos naquele arquivo, em vez de estender os existentes com ele.Se você deseja estender os certificados existentes (por exemplo, com um certificado de empresa), usar a variável de ambiente
NODE_EXTRA_CA_CERTS
para vincular ao arquivo é o caminho a percorrer e pode lhe poupar muito trabalho. Veja how-to-add-custom-certificate-authority-ca-to-nodejsfonte
=
npm config set cafile "<path to your certificate file>"
Este problema foi corrigido para mim usando a versão http do repositório:
fonte
resolveu o problema para mim. Neste caso, meu agente e o depósito de artefatos estão atrás de uma sub-rede privada na nuvem aws
fonte
Estou tendo o mesmo problema, superei usando
Além disso, informações em node-doc
fonte
Aconteceu de eu encontrar esse problema de SSL semelhante há alguns dias. O problema é que seu npm não define o certificado raiz para o certificado usado por https://registry.npmjs.org .
Soluções:
wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt
para consertar o problema wgetnpm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crt
para definir o certificado raiz para seu programa npm.você pode baixar o certificado raiz em:
https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt
Aviso: programas diferentes podem usar maneiras diferentes de gerenciar o certificado raiz, portanto, não misture navegadores com outros.
Análise:
vamos resolver seu
wget https://registry.npmjs.org/coffee-script
problema primeiro. seu snippet diz:Isso significa que seu programa wget não pode verificar
https://registry.npmjs.org
o certificado de. Existem dois motivos que podem causar este problema:Portanto, a solução é definir explicitamente o certificado raiz para
https://registry.npmjs.org
. Podemos usar o openssl para ter certeza de que o motivo abaixo é o problema.Experimente
openssl s_client -host registry.npmjs.org -port 443
a linha de comando e obteremos esta mensagem (primeiras linhas):Esta linha
verify error:num=20:unable to get local issuer certificate
garante quehttps://registry.npmjs.org
não empacota o certificado raiz. Então, nósDigiCert High Assurance EV Root CA
certificamos o Google root.fonte
Eu estava tendo o mesmo problema. Após algumas pesquisas, percebi que muitos scripts de pós / pré-instalação tentariam instalar várias dependências e, algumas vezes, repositórios específicos são usados. A melhor maneira é desabilitar a verificação de certificado do módulo https para nodejs que funcionou para mim.
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
Desta questão
fonte
O problema está no seu proxy. Como o provedor de localização do pacote de instalação cria seu próprio certificado e não compra um certificado verificado de uma autoridade aceita, seu proxy não permite acesso ao host de destino. Presumo que você ignore o proxy ao usar o navegador Chrome. Portanto, não há verificação.
Existem algumas soluções para este problema. Mas tudo indica que você confia no provedor do pacote.
Soluções possíveis:
http://
acesso que pode contornar o seu proxy. Isso é um pouco perigoso, porque o homem no meio pode injetar malware em seus downloads.wget
sugere que você use uma bandeira--no-check-certificate
. Isso adicionará uma diretiva de proxy ao seu pedido. O proxy, se entender a diretiva, não verifica se o certificado do servidor é verificado por uma autoridade e passa a solicitação. Talvez haja uma configuração com npm que faz o mesmo que o sinalizador wget.fonte
defina a propriedade abaixo:
"npm config set strict-ssl false"
fonte
Se você tiver controle sobre o servidor proxy ou puder convencer seus administradores de TI, poderá tentar excluir explicitamente o registry.npmjs.org da inspeção SSL. Isso deve evitar que os usuários do servidor proxy tenham que desativar a verificação estrita-ssl ou instalar uma nova CA raiz.
fonte
Isso é o que você pode fazer para evitar npm e usar fios em máquinas de janelas.
fonte