Usando o npm por trás do proxy corporativo .pac

158

Preciso fazer o download de vários pacotes através do npm, mas nossa configuração de proxy corporativo é um arquivo .pac (eu estou no windows)

Eu já tentei

npm config set proxy http://mydomain\username:[email protected]:8181/proxy.pac
npm config set https-proxy http://mydomain\username:[email protected]:8181/proxy.pac

ou

npm config set proxy http://1.2.3.4:8181/proxy.pac
npm config set https-proxy http://1.2.3.4:8181/proxy.pac

mas não funciona ...

alguma sugestão? obrigado

Doc
fonte
8
Eu não acho que esta questão é uma duplicata, scripts de pac pode conter vários endereços de proxy, dependendo do endereço de destino IP / host, enquanto o Dube se dirige apenas 1 endereço de proxy - Do comentário
Ferrybig
1
Nenhuma resposta indica como usar scripts pac, que podem conter vários endereços proxy, dependendo do endereço IP / host de destino. Alguém pode ajudar por favor.
Partha Sarathi Ghosh
2
Para mim, ajudou a abrir o proxy.pacarquivo para obter o endereço proxy. (No meu caso, eu simplesmente tive que mudar de porta para 8080).
Nó #
@ParthaSarathiGhosh Você está certo, nenhuma das respostas realmente explicou como usar os scripts PAC, então adicionei outra resposta que trata disso: stackoverflow.com/a/61811444 . Está alguns anos atrasado, mas antes tarde do que nunca?
user1031921

Respostas:

204

Acabei de ter um problema muito semelhante, em que não conseguia que o npm trabalhasse atrás do nosso servidor proxy.

Meu nome de usuário tem o formato "domínio \ nome de usuário" - incluindo a barra na configuração do proxy resultou na exibição de uma barra. Então, inserindo isso:

npm config set proxy "http://domain\username:password@servername:port/"

executando isso npm config get proxyretorna: http: // domínio / nome de usuário: senha @ nome do servidor: porta /

Portanto, para corrigir o problema, em vez disso, codifiquei a URL na barra invertida e inseri isso:

npm config set proxy "http://domain%5Cusername:password@servername:port/"

e com isso o acesso ao proxy foi corrigido.

Steve Roberts
fonte
5
sua causa sua falta a parte .key% 5C sendo o C .... ver i espaçadas-lo para ya
sinisterrook
1
Acabei de atualizar algumas coisas e meu proxy parou de funcionar novamente. Aconteceu que na configuração "proxy" do arquivo .npmrc (como mencionado abaixo por @Ovidiu Buligan), ele continha o% 5C da barra invertida, mas o "proxy https" continha apenas o "\". Alterar isso para% 5C também corrigiu o problema. Eu presumo que isso também poderia ser atualizado executando conjunto npm configuração http_proxy " domínio% 5Cusername: password @ servername: port /"
Steve Roberts
1
Estou tentando configurar o npm por trás do proxy, mas existe uma maneira de fazer um "ping" usando a configuração do npm. Porque se minha conf estiver errada, meu usuário será bloqueado no meu domínio corporativo.
Ricardo
3
O que funcionou para mim é LIMPAR primeiro as variáveis ​​ambientais danadas. Use o conjunto HTTP_PROXY = e configure HTTPS_PROXY =
Sydwell
4
Adicionando strict-ssl=falseao .npmrcarquivo de configuração resolvido para mim por trás de um proxy corporativo - veja as respostas em @ ovidiu-buligan e @ karthikeyan-a
Alexander McFarlane
64

Procure o URL do pacarquivo nas configurações de LAN do Internet Explorer e faça o download do arquivo pac a partir da URL configurada. O arquivo pac é apenas um arquivo javascript com uma função denominada FindProxyForURLque retorna diferentes hosts proxy em diferentes cenários.

Tente encontrar um host nesse arquivo pac que você considere ser para o tráfego geral da web e conecte-o ao .npmrc C:\Users\<username>\.npmrc

proxy=http://<username>:<pass>@proxyhost:<port>
https-proxy=http://<uname>:<pass>@proxyhost:<port>

Mesmo que você possa fazer login com seu domínio e nome de usuário em sua máquina corporativa, é altamente possível que o nome de domínio do diretório ativo do usuário não seja necessário para o proxy , apenas o nome de usuário e a senha (que podem ser diferentes do seu login no Active Directory)

Não se esqueça de mexer nos caracteres de senha especiais que escapam.

Ovidiu Buligan
fonte
obrigado. Naveguei para .npmrc e alterei as configurações. ele trabalhou
ARN-ARN
54

Faça o download do seu .pacarquivo. Abra-o em qualquer editor e procure PROXY = "PROXY X.X.X.X:80;. Você pode ter muitos proxies, copie qualquer um deles e execute os seguintes comandos do terminal:

npm config set proxy http://X.X.X.X:80
npm config set https-proxy http://X.X.X.X:80

Agora você deve conseguir instalar qualquer pacote!

Sumeet_Pol
fonte
1
Para a parte https-proxy, eu tinha que fazer "... definir https-proxy = http: // ..." em vez de "... definir https-proxy http: // ..." para que trabalhos. Apenas meus $ .02.
25416 Nick
Obrigado por definir o proxy https como http: // é a única coisa que funcionou; depois de desmarcar as variáveis ​​de ambiente http_proxy e https_proxy do bash!
precisa
Para o proxy https, não era possível definir "definir https https: /.../", era necessário definir "definir http proxy https: // ..." (informações sobre proxy de https -> http)
Marte
o mesmo vale para o git também, #git config --global http.proxy http://X.X.X.X:80 git config --global https.proxy http://X.X.X.X:80
Código Jack Jack
38

Eu resolvi esse problema da seguinte maneira:

1) Eu executo este comando:

npm config set strict-ssl false

2) Em seguida, defina npm para executar com http, em vez de https:

npm config set registry "http://registry.npmjs.org/"

3) Em seguida, instale seu pacote

npm install <package name>

KARTHIKEYAN.A
fonte
2
Apenas para salientar que configurar o strict-ssl do npm como false é um problema de segurança. Em vez disso, considere configurar corretamente a ca[]propriedade no npm.
Aaron C
26

Para expandir a resposta @Steve Roberts.

Meu nome de usuário tem o formato "domínio \ nome de usuário" - incluindo a barra na configuração do proxy resultou na exibição de uma barra. Então, inserindo isso:

npm config set proxy "http://domain\username:password@servername:port/"

Também tive que codificar por URL minha domain\userstring, no entanto, tenho um espaço dentro do meu nome de usuário, então coloquei a +para codificar a codificação de URL de espaço, mas ela seria codificada duas vezes como %2B(que é a codificação de URL para o sinal de mais, no entanto, a URL codificação para um espaço é %20), então eu tive que fazer o seguinte:

comando npm

// option one 
// it works for some packages
npm config set http_proxy "http://DOMAIN%5Cuser+name:[email protected]:port"
npm config set proxy "http://DOMAIN%5Cuser+name:[email protected]:port"

// option two
// it works best for me
// please notice that I actually used a space 
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://DOMAIN%5Cuser name:[email protected]:port"
npm config set proxy "http://DOMAIN%5Cuser name:[email protected]:port"

// option two (B) as of 2019-06-01
// no DOMAIN
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://user name:[email protected]:port"
npm config set proxy "http://user name:[email protected]:port"

solução de problemas de configuração do npm

Eu usei o npm config listpara obter os valores analisados ​​que eu havia definido acima, e foi assim que descobri a codificação dupla. Esquisito.

Essencialmente, você deve descobrir os seguintes requisitos:

  1. É uma DOMAINsequência necessária para autenticação
  2. Você precisa codificar caracteres especiais?
    • Os espaços e os sinais (@) são especialmente desafiadores

Saudações.

VARIÁVEIS AMBIENTAIS DO WINDOWS (prompt do CMD)

Atualizar

Acontece que, mesmo com as configurações acima, eu ainda tinha alguns problemas com alguns pacotes / scripts que usam o cliente HTTP Request - Simplified internamente para baixar coisas. Portanto, como o leia-me acima explicou, podemos especificar variáveis ​​de ambiente para definir o proxy na linha de comandos, e Request irá respeitar esses valores.

Então, depois (e reluto em admitir isso) de várias tentativas (mais parecidas com dias), de tentar definir as variáveis ​​de ambiente, finalmente consegui as seguintes diretrizes:

rem notice that the value after the = has no quotations
rem    - I believe that if quotations are placed after it, they become
rem    part of the value, you do not want that
rem notice that there is no space before or after the = sign
rem     - if you leave a space before it, you will be declaring a variable 
rem     name that includes such space, you do not want to do that
rem     - if you leave a space after it, you will be including the space
rem     as part of the value, you do not want that either
rem looks like there is no need to URL encode stuff in there
SET HTTP_PROXY=http://DOMAIN\user name:[email protected]:port
SET HTTPS_PROXY=http://DOMAIN\user name:[email protected]:port

cntlm

Usei a técnica acima por algumas semanas, até perceber a sobrecarga de atualizar minha senha em todas as ferramentas que precisavam da configuração do proxy.

Além do npm, eu também uso:

  • caramanchão
  • vagabundo
    • caixa virtual (executando linux)
    • apt-get [linux]
  • git
  • vscode
  • colchetes
  • átomo
  • tsd

Etapas de instalação do cntlm

Então, eu instalei o cntlm . A configuração cntlmé bastante direta, você procura o arquivo ini @C:\Program Files\Cntlm\cntlm.ini

  1. Aberto C:\Program Files\Cntlm\cntlm.ini(você pode precisar de direitos de administrador)
  2. procure Usernamee Domainlinhas (linha 8-9 eu acho)
    • adicione seu nome de usuário
    • adicione seu domínio
  3. No prompt do cmd, execute:

    cd C:\Program Files\Cntlm\
    cntlm -M
    cntlm -H  
    • você será solicitado a senha:
     cygwin warning:
       MS-DOS style path detected: C:\Program Files\Cntlm\cntlm.ini
       Preferred POSIX equivalent is: /Cntlm/cntlm.ini
       CYGWIN environment variable option "nodosfilewarning" turns off this warning.
       Consult the user's guide for more details about POSIX paths:
         http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
     Password:
  4. A saída que você obtém cntlm -Hserá semelhante a:

    PassLM          561DF6AF15D5A5ADG  
    PassNT          A1D651A5F15DFA5AD  
    PassNTLMv2      A1D65F1A65D1ASD51  # Only for user 'user name', domain 'DOMAIN'
    • Recomenda-se que você use PassNTLMv2 para adicionar uma #linha antes PassLMe PassNTou não usá-los
  5. Cole a saída cntlm -Hno arquivo ini, substituindo as linhas por PassLM, PassNTe PassNTMLv2, ou comente as linhas originais e adicione as suas.
  6. Adicione seus Proxyservidores. Se você não souber o que é o servidor proxy ... Faça o que fiz, procurei meu arquivo de configuração automática de proxy procurando a AutoConfigURLchave do Registro emHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings . Navegue até esse URL e veja o código que passa a ser JavaScript.
  7. Opcionalmente, você pode alterar a porta na qual o cntlm escuta, alterando a Listen ####linha, onde ####está o número da porta.

Configurar NPM com cntlm

Então, você aponta o npm para o seu proxy cntml, pode usar o ip, eu usei localhoste a porta padrão para o cntlm, 3128para que o meu URL do proxy se pareça com este

http://localhost:3128

Com o comando apropriado:

proxy do conjunto de configurações npm http: // localhost: 3128

É muito mais simples. Você configura todas as suas ferramentas com o mesmo URL e atualiza a senha apenas em um local. A vida é muito mais simples, não.

É necessário configurar O certificado CA npm

Na documentação do npm ca

Se o seu proxy corporativo estiver interceptando conexões https com seu próprio certificado autoassinado, é necessário evitar npm config set strict-ssl false (grande não-não).

Etapas básicas

  1. Obtenha o certificado no seu navegador (o Chromes funciona bem). Exporte-o como X.509 codificado em Base-64 (.CER)
  2. Substitua novas linhas por \n
  3. Edite sua .npmrcadição de uma linhaca[]="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"

Problemas

Percebi que, às vezes, o tipo NPM trava, então paro (às vezes com força) o cntlm e o reinicio.

Aaron C
fonte
7

Eu tive vários problemas com isso e, finalmente, o que fiz foi o seguinte:

  1. Violinista usado, com "Autenticar automaticamente" selecionado
  2. Nas regras personalizadas do violinista, adicionei

    if (m_AutoAuth) {oSession["X-AutoAuth"] = "domain\\username:password";}
  3. Finalmente, no npm, defino o proxy como http: // localhost: 8888

Isso funcionou bem.

Shoel Palli
fonte
Obrigado! Trabalhou como um encanto !! Meu cenário: o nome de usuário estava no formato "domínio / nome de usuário". A senha tinha um "@". Não precisava fazer nenhuma codificação / decodificação de URL, etc.
A_B
Funcionou perfeitamente para mim. Muito obrigado. Só queria salientar que o uso "domain\\username:password"pode representar uma ameaça à segurança do roubo de identidade. Em vez disso, o uso da "(default)"configuração nas regras personalizadas funcionou encantadoramente. O Fiddler precisa estar em execução enquanto você usa "npm" para que isso funcione.
Pk10
7

Para quem está enfrentando um firewall corporativo, além de problemas com SSL (não é possível obter o certificado do emissor local), aqui estão algumas etapas que você pode tentar:

Esqueça o SSL

Se você não estiver preocupado com SSL, poderá seguir os conselhos de muitos colaboradores anteriores, configurando seus proxies e alterando o registro para a versão não segura:

npm config set proxy http://username:password@proxyname:port
npm config set https-proxy http://username:password@proxyname:port
npm config set registry http://registry.npmjs.org/

Uma rápida "dica" aqui, minhas credenciais de proxy são as mesmas para solicitações protegidas e não protegidas (observe como deixei meu protocolo como http: // para a configuração do proxy https ). Pode ser o mesmo para você e pode não ser.

Eu quero manter o SSL

Se você deseja manter o SSL e não deseja usá strict-ssl=false-lo, há mais trabalho a fazer. Para mim, estou protegido por um firewall corporativo e estamos usando certificados autoassinados, então recebo o erro unable to get local issuer certificate. Se você estiver no mesmo barco que eu, precisará definir a cafile=opção no arquivo de configuração npm. Primeiro, você precisa criar um arquivo PEM que contenha informações sobre seus certificados autoassinados. Se você não souber como fazer isso, aqui estão as instruções para um ambiente Windows sem usar software de terceiros:

Precisamos indicar explicitamente quais certificados devem ser confiáveis, porque estamos usando certificados de autoassinatura. No meu exemplo, naveguei para www.google.com usando o Chrome para obter os certificados.

No Chrome, vá para Inspecionar -> Segurança -> Exibir certificado. Você verá todos os certificados que permitem a conexão SSL. Observe como esses certificados são autoassinados. A parte confusa é a minha empresa e não somos uma Autoridade Certificada. Você pode exportar o caminho completo do certificado como um arquivo P7B ou exportar os certificados individualmente como arquivos CER (codificação base64). Exportar o caminho completo como P7B não é muito bom, pois você precisará abrir esse arquivo em um gerenciador de certificados e exportar como arquivos CER individuais de qualquer maneira. No Windows, clicar duas vezes no arquivo P7B abrirá o aplicativo Gerenciador de Certificados.

insira a descrição da imagem aqui

Exportar como CER (Base 64) é realmente um arquivo de texto no seguinte formato:

-----BEGIN CERTIFICATE-----
MIIGqzCCBZOgAwIBAgITIwAAABWhFPjwukYhTAADAAAAFTANBgkqhkiG9w0BAQUF
ADBFMRMwEQYKCZImiZPyLGQBGRYDY29tMRYwFAYKCZImiZPyLGQBGRYGaXJ2aW5n
b0pvCkNmjWzaNNUg2hYET+pP5nP75aRu+kPRl9UnlQ....rest of certificate...
-----END CERTIFICATE-----

Para criar nosso arquivo PEM, precisamos simplesmente empilhar esses certificados um sobre o outro em um único arquivo e alterar a extensão para .pem. Eu usei o bloco de notas para fazer isso.

Você empilha os certificados na ordem inversa do caminho do certificado. Assim, acima, eu começaria com * .google.com e colaria o Websense abaixo dele, depois emitindo CA 1 etc. Dessa forma, os certificados são analisados ​​de cima para baixo, procurando a CA raiz apropriada. A simples inclusão da CA raiz não funcionará, mas também não precisamos incluir todos os certificados. No caminho acima, preciso incluir apenas os certificados anteriores ao certificado Websense (CA de emissão 1, CA de política, CA raiz).

Depois que esses certificados autoassinados são salvos em um arquivo PEM, estamos prontos para instruir o npm a usar esses certificados como nossa CA confiável. Basta definir o arquivo de configuração e você deve estar pronto:

npm config set cafile "C:\yourcerts.pem"

Agora, com seus proxies definidos (http e https) e o registro definido como https://registry.npmjs.org, você poderá instalar pacotes atrás de um firewall corporativo com certificados autoassinados sem alterar a strict-sslconfiguração.

John Galt
fonte
6

Você pode verificar o Fiddler se o NPM está dando erro de autenticação. É fácil de instalar e configurar. Defina a regra do violinista como Autenticada automaticamente. Em .npmrc defina essas propriedades

registry=http://registry.npmjs.org
proxy=http://127.0.0.1:8888
https-proxy=http://127.0.0.1:8888
http-proxy=http://127.0.0.1:8888
strict-ssl=false

Funcionou para mim :)

Rakesh Sharma
fonte
Surpreendentemente, nenhuma das configurações que eu usei para o meu procurador trabalhou, eu usei isso e violinista aberta e eu poderia usá-lo muito bem ...
Roberto
5

Tente isso, defina o proxy em npm da seguinte maneira

npm config set proxy "http://<user-name>:<password>@<proxy-url>:<port>"
npm config set https-proxy "http://<user-name>:<password>@<proxy-url>:<port>"
npm config set strict-ssl false
npm config set registry "http://registry.npmjs.org/"
Mohammed Safeer
fonte
4

Você receberá o host e a porta do proxy do administrador ou do suporte do servidor.

Depois disso configurado

npm config set http_proxy http://username:[email protected]:itsport
npm config set proxy http://username:[email protected]:itsport

Se houver algum caractere especial na senha, tente com% urlencode. Por exemplo: - libra (hash) deve ser substituída por% 23.

Isso funcionou para mim ...

Shamseer
fonte
3

Basta criar um arquivo chamado .npmrc na pasta do seu projeto, para evitar a configuração de proxy no nível do sistema

#Without password
proxy=http://ipaddress:80
https-proxy=http://ipaddress:80

#With password
proxy=http://<username>:<pass>@proxyhost:<port>
https-proxy=http://<uname>:<pass>@proxyhost:<port>

Comente assim se você não usar o proxy

#proxy=http://ipaddress:80
#https-proxy=http://ipaddress:80

#With password
#proxy=http://<username>:<pass>@proxyhost:<port>
#https-proxy=http://<uname>:<pass>@proxyhost:<port>
Vinayak Shedgeri
fonte
3

Nenhuma das respostas existentes explica como usar o npm com um arquivo PAC. Alguns sugerem o download do arquivo PAC, a inspeção manual e a escolha de uma das seqüências "PROXY ...". Mas isso não funciona se o arquivo PAC precisar escolher entre vários proxies ou se o arquivo PAC contiver uma lógica complexa para ignorar proxies para determinados URLs.

Além disso, alguns proxies corporativos exigem autenticação NTLM. O CNTLM pode lidar com autenticação, mas não suporta arquivos PAC.

Uma alternativa é usar o Alpaca , que executa o arquivo PAC em uma VM JavaScript e executa a autenticação NTLM com o proxy resultante.

user1031921
fonte
2

Se você está atrás de uma rede corporativa com proxy, usei apenas uma ferramenta de proxy ntlm e usei a porta e o proxy fornecidos pelo ntlm, por exemplo, usei esta configuração:

strict-ssl=false
proxy=http://localhost:3125

Eu espero que isso ajude.

yunieski dieguez garcia
fonte
2

Use o comando abaixo no cmd ou GIT Bash ou outro prompt

$ npm config set proxy "http://192.168.1.101:4128"

$ npm config set https-proxy "http://192.168.1.101:4128"

onde 192.168.1.101 é proxy ip e 4128 é porta. altere de acordo com as suas configurações de proxy.

Pankaj
fonte
2

Você deve usar "npm config set http-proxy "

usar:

npm config set http-proxy http://1.2.3.4:8181
npm config set https-proxy http://1.2.3.4:8181
Júnior Mendonça
fonte
1

No trabalho, usamos o ZScaler como nosso proxy. A única maneira de conseguir que o npm funcionasse era usar o Cntlm .

Veja esta resposta:

NPM atrás do proxy NTLM

bruceceng
fonte
1

Tente isso, foi o único que funcionou para mim:

npm --proxy http: //: @proxyhost: --https-proxy http: //: @proxyhost: --strict-ssl false install -g pacote

Preste atenção à opção --strict-ssl false

Boa sorte.

Matías Dell'Oso
fonte
1

A configuração do proxy NPM mencionada na resposta aceita resolve o problema, mas como você pode ver neste problema do npm , algumas dependências usam o GIT e isso torna necessária a configuração do proxy git , e pode ser feito da seguinte maneira:

git config --global http.proxy http://username:password@host:port
git config --global https.proxy http://username:password@host:port

A configuração do proxy NPM mencionou:

npm config set proxy "http://username:password@host:port"
npm config set https-proxy "http://username:password@host:port"
npm config set strict-ssl false
npm config set registry "http://registry.npmjs.org/"
Josiel Faleiros
fonte
0

Eu tive um problema semelhante e tentei todas as soluções alternativas acima, mas nenhuma delas funcionou para mim (eu estava usando caracteres especiais (como o símbolo '@') na minha senha e também precisava adicionar o nome de domínio).

Além disso, fiquei um pouco apreensivo ao adicionar minha senha como texto simples. A solução mais fácil de superar todos esses desafios foi usar algum tipo de proxy reverso (como o Fiddler).

Eu já detalhei as etapas de configuração nesta resposta no SO.

Karthik
fonte
0

Adicionar as linhas abaixo no arquivo .typingsrc me ajudou.

{
    "rejectUnauthorized": false,
    "registryURL" :"http://api.typings.org/"
 }
Tapas Ranjan Singh
fonte
0

Corri para um problema semelhante e descobri que meu arquivo de configuração npm (.npmrc) está tendo entrada incorreta no Registro. comentou e correu o npm install. funcionou.

Ravi Siva Prasad M
fonte
0

OS: Windows 7

Etapas que funcionaram para mim:

  1. npm config get proxy
  2. npm config get https-proxy

  3. Comentários: Eu executei este comando para conhecer minhas configurações de proxy
    npm config rm proxy

  4. npm config rm https-proxy
  5. npm config set registry=http://registry.npmjs.org/
  6. npm install
Suchi Dvg
fonte
0

Como ainda tenho problemas para definir as configurações de proxy no trabalho e desativá- las em casa, criei um script e publico o npm-corpo-proxy.sh . Em todo corpo, a senha deve ser alterada frequentemente e deve conter caracteres especiais, que devem ser codificados antes da alimentação do npm config (o mesmo para o domínio \ usuário do formulário de backash).

Maciek Leks
fonte
0

De uma pequena pesquisa no google, a primeira coisa que tentei foi esta

npm config set registry http://registry.npmjs.org/
npm config set proxy "your proxy"
npm config set https-proxy "your proxy"

Mas ainda assim o npm parecia perder a conexão ao tentar fazer a instalação do "npm". então eu corri esta linha no prompt de comando e agora posso usar o npm install

set NODE_TLS_REJECT_UNAUTHORIZED=0
Barkin Kaplan
fonte
0

Não consegui fazê-lo funcionar com o CNTLM. Tentei seguir todas as informações postadas acima, mas o proxy ainda não autorizou a conexão. Com o Fiddler, você apenas precisa instalá-lo e verificar a opção Autenticado automaticamente. Mas, para trabalhar, eu tive que remover o arquivo .npmrc da minha pasta de usuário e definir as variáveis ​​de ambiente conforme indicado aqui , com estes valores:

set npm_config_https-proxy="http://127.0.0.1:8888"

set npm_config_registry="http://registry.npmjs.org/"
Guilherme Pereira
fonte