Usando npm detrás del proxy corporativo .pac

158

Necesito descargar varios paquetes a través de npm pero nuestra configuración de proxy corporativo es un archivo .pac (estoy en Windows)

Ya lo he intentado

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

o

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

pero no funciona ...

¿cualquier sugerencia? Gracias

Doc
fuente
8
No creo que esta pregunta sea un duplicado, los scripts pac pueden contener múltiples direcciones proxy dependiendo de la dirección IP / host de destino, mientras que el dube solo aborda 1 dirección proxy - De la revisión
Ferrybig
1
Ni una sola respuesta indica cómo usar scripts pac que pueden contener múltiples direcciones proxy dependiendo de la dirección IP / host de destino. ¿Alguien puede ayudar por favor?
Partha Sarathi Ghosh
2
Para mí, ayudó a abrir el proxy.pacarchivo para obtener una dirección proxy. (En mi caso, simplemente tuve que cambiar el puerto a 8080).
nómada
@ParthaSarathiGhosh Tienes razón, ninguna de las respuestas realmente explicaba cómo usar los scripts PAC, así que agregué otra respuesta que aborda esto: stackoverflow.com/a/61811444 . Es unos años tarde, ¿pero mejor tarde que nunca?
user1031921

Respuestas:

204

Acabo de tener un problema muy similar, donde no pude hacer que npm funcione detrás de nuestro servidor proxy.

Mi nombre de usuario tiene la forma "dominio \ nombre de usuario", incluida la barra oblicua en la configuración del proxy que resultó en una barra diagonal. Entonces entrando en esto:

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

luego de ejecutar esto npm config get proxydevuelve esto: http: // dominio / nombre de usuario: contraseña @ nombre del servidor: puerto /

Por lo tanto, para solucionar el problema, en su lugar, URL codificó la barra diagonal inversa, así que ingresé esto:

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

y con esto se solucionó el acceso proxy.

Steve Roberts
fuente
55
es porque te falta la parte clave de% 5C. Es la C .... mira, te la he dejado
sinisterrook
1
Acabo de actualizar algunas cosas y mi proxy dejó de funcionar nuevamente. Resultó que en la configuración "proxy" del archivo .npmrc (como se menciona a continuación por @Ovidiu Buligan) contenía el% 5C para la barra invertida, pero el "proxy https" solo contenía el "\". Cambiar esto también a% 5C solucionó el problema. Supongo que esto también podría actualizarse ejecutando npm config set http_proxy " dominio% 5Nombre de usuario: contraseña @ nombre de servidor: puerto /"
Steve Roberts
1
Estoy tratando de configurar npm detrás del proxy, pero hay una manera de hacer un "ping" usando la configuración npm. Porque si mi conf es incorrecta, mi usuario será bloqueado en mi dominio corporativo.
Ricardo
3
Lo que funcionó para mí es BORRAR las malditas variables ambientales primero. Use set HTTP_PROXY = y configure HTTPS_PROXY =
Sydwell
44
Agregar strict-ssl=falseal .npmrcarchivo de configuración resuelto para mí detrás de un proxy corporativo - vea las respuestas de @ ovidiu-buligan y @ karthikeyan-a
Alexander McFarlane
64

Busque la url del pacarchivo en la configuración de LAN de Internet Explorer y descargue el archivo pac desde la URL configurada. El archivo pac es solo un archivo javascript con una función denominada FindProxyForURLque devuelve diferentes hosts proxy en diferentes escenarios.

Intente encontrar un host en ese archivo pac que cree que es para el tráfico web general y conéctelo a .npmrc en C:\Users\<username>\.npmrc

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

Aunque puede iniciar sesión con su dominio y nombre de usuario en su máquina corporativa, es muy posible que el nombre de dominio del directorio activo del usuario no sea necesario para el proxy , solo el nombre de usuario y la contraseña (que pueden ser diferentes a su inicio de sesión de Active Directory)

No olvides jugar con caracteres de contraseña especiales de escape.

Ovidiu Buligan
fuente
Gracias. Navegué a .npmrc y cambié la configuración. funcionó
arn-arn
54

Descargue su .pacarchivo. Ábralo en cualquier editor y búsquelo PROXY = "PROXY X.X.X.X:80;. Es posible que tenga muchos servidores proxy, copie cualquiera de ellos y ejecute los siguientes comandos de terminal:

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

¡Ahora debería poder instalar cualquier paquete!

Sumeet_Pol
fuente
1
Para la parte https-proxy, tuve que hacer "... establecer https-proxy = http: // ..." en lugar de "... establecer https-proxy http: // ..." para que sea trabajo. Solo mis $ .02.
Nick
Gracias configurar https-proxy en http: // es lo único que funcionó; después de desarmar las variables de entorno http_proxy y https_proxy de bash!
Alex Punnen
Para https-proxy, no pude establecer "set https-proxy https: /.../", tuve que configurar "set https-proxy http: // ..." (información de proxy de https -> http)
Marte
lo mismo va para git también,git config --global http.proxy http://X.X.X.X:80 git config --global https.proxy http://X.X.X.X:80
Nombre
38

Resolví este problema de esta manera:

1) Ejecuto este comando:

npm config set strict-ssl false

2) Luego configure npm para que se ejecute con http, en lugar de https:

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

3) Luego instala tu paquete

npm install <package name>

KARTHIKEYAN.A
fuente
2
Solo para señalar que establecer el estricto-ssl de npm en falso es un problema de seguridad. Considere en su lugar configurar correctamente la ca[]propiedad en npm.
Aaron C
26

Para ampliar la respuesta de @Steve Roberts.

Mi nombre de usuario tiene la forma "dominio \ nombre de usuario", incluida la barra oblicua en la configuración del proxy que resultó en una barra diagonal. Entonces entrando en esto:

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

También tuve que codificar mi domain\usercadena en URL , sin embargo, tengo un espacio dentro de mi nombre de usuario, así que puse un +para codificar la codificación de la URL del espacio, pero se codificó doble como %2B(que es la codificación de URL para el signo más, sin embargo, la URL codificar para un espacio es%20 ), así que tuve que hacer lo siguiente:

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"

solución de problemas de configuración npm

Utilicé el npm config listpara obtener los valores analizados que había establecido anteriormente, y así es como descubrí la codificación doble. Extraño.

Esencialmente, debe resolver los siguientes requisitos:

  1. ¿Se DOMAINrequiere una cadena para la autenticación?
  2. ¿Necesitas codificar caracteres especiales?
    • Los espacios y los signos (@) son especialmente desafiantes

Saludos.

VARIABLES DE ENTORNO DE WINDOWS (Aviso CMD)

Actualizar

Resulta que incluso con las configuraciones anteriores, todavía tuve algunos problemas con algunos paquetes / scripts que usan Solicitud - Cliente HTTP simplificado internamente para descargar cosas. Entonces, como se explica en el archivo Léame anterior, podemos especificar variables de entorno para establecer el proxy en la línea de comando, y Request respetará esos valores.

Luego, después (y soy reacio a admitir esto) varios intentos (más como días), de tratar de establecer las variables de entorno, finalmente logré las siguientes pautas:

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

Utilicé la técnica anterior durante algunas semanas, hasta que me di cuenta de la sobrecarga de actualizar mi contraseña en todas las herramientas que necesitaban la configuración del proxy.

Además de npm, también uso:

  • cenador
  • vagabundo
    • caja virtual (ejecutando Linux)
    • apt-get [linux]
  • git
  • vscode
  • soportes
  • átomo
  • tsd

Pasos de configuración de cntlm

Entonces, instalé cntlm . La configuración cntlmes bastante sencilla, busca el archivo ini @C:\Program Files\Cntlm\cntlm.ini

  1. Abierto C:\Program Files\Cntlm\cntlm.ini(puede que necesite derechos de administrador)
  2. buscar Usernamey Domainlíneas (línea 8-9 creo)
    • agrega tu nombre de usuario
    • agrega tu dominio
  3. En cmd prompt run:

    cd C:\Program Files\Cntlm\
    cntlm -M
    cntlm -H  
    • se le pedirá la contraseña:
     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. El resultado que obtenga cntlm -Hse verá más o menos así:

    PassLM          561DF6AF15D5A5ADG  
    PassNT          A1D651A5F15DFA5AD  
    PassNTLMv2      A1D65F1A65D1ASD51  # Only for user 'user name', domain 'DOMAIN'
    • Se recomienda que use PassNTLMv2, así que agregue una #línea anterior PassLMy PassNTno los use
  5. Pega el resultado de cntlm -Hla ini reemplazar las líneas para PassLM, PassNTy PassNTMLv2, o comentar las líneas originales y añadir la suya.
  6. Agrega tus Proxyservidores. Si no sabe qué es el servidor proxy ... Haga lo que hice, busqué mi archivo de configuración automática de proxy buscando la AutoConfigURLclave del Registro enHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings . Navegue a esa URL y mire a través del código que resulta ser JavaScript.
  7. Opcionalmente, puede cambiar el puerto donde escucha cntlm cambiando la Listen ####línea, donde ####está el número de puerto.

Configurar NPM con cntlm

Entonces, apuntas npm a tu proxy cntml, puedes usar la ip, yo usé localhosty el puerto predeterminado para cntlm 3128para que mi url proxy se vea así

http://localhost:3128

Con el comando adecuado:

npm config set proxy http: // localhost: 3128

Es mucho más simple Configura todas sus herramientas con la misma URL y solo actualiza la contraseña en un lugar. La vida es mucho más simple, no.

Debe configurar el certificado npm CA

De la documentación npm ca

Si su proxy corporativo está interceptando conexiones https con su propio certificado autofirmado, esto es imprescindible para evitar npm config set strict-ssl false (gran no-no).

Pasos básicos

  1. Obtenga el certificado de su navegador (Chromes funciona bien). Exportarlo como Base-64 codificado X.509 (.CER)
  2. Reemplazar nuevas líneas con \n
  3. Edite su .npmrcagregar una líneaca[]="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"

Cuestiones

He notado que a veces npm se cuelga, así que detengo (a veces con fuerza) cntlm y lo reinicio.

Aaron C
fuente
7

Me encontré con varios problemas con esto y finalmente lo que hice es lo siguiente:

  1. Fiddler usado, con "Autenticar automáticamente" seleccionado
  2. En las reglas personalizadas de Fiddler, agregué

    if (m_AutoAuth) {oSession["X-AutoAuth"] = "domain\\username:password";}
  3. Finalmente en npm configuré el proxy en http: // localhost: 8888

Esto funcionó bien.

Shoel Palli
fuente
¡Gracias! ¡¡Trabajado como un encanto!! Mi escenario: el nombre de usuario tenía el formato "dominio / nombre de usuario". La contraseña tenía una "@". No tuve que hacer ninguna codificación / decodificación de URL, etc. en absoluto
A_B
Funcionó perfectamente para mí. Muchas gracias. Solo quería señalar que el uso "domain\\username:password"puede representar una amenaza de seguridad para el robo de identidad. En cambio, usar la "(default)"configuración en las reglas personalizadas funcionó de manera encantadora. Fiddler debe estar ejecutándose mientras usa "npm" para que esto funcione.
pk10
7

Para cualquiera que tenga problemas con un firewall corporativo, así como problemas con SSL (no puede obtener el certificado de emisor local), aquí hay algunos pasos que puede probar:

Olvídate de SSL

Si no le preocupa SSL, puede seguir los consejos de muchos contribuyentes anteriores configurando sus servidores proxy y cambiando el registro a la versión no 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/

Un "truco" rápido aquí, mis credenciales de proxy son las mismas para solicitudes seguras y no seguras (observe cómo dejé mi protocolo como http: // para la configuración https-proxy ). Esto puede ser lo mismo para usted, y puede que no.

Quiero mantener SSL

Si desea conservar SSL y no desea utilizarlo strict-ssl=false, entonces tiene más trabajo por hacer. Para mí, estoy detrás de un firewall corporativo y estamos usando certificados autofirmados, así que recibo el error unable to get local issuer certificate. Si está en el mismo barco que yo, deberá configurar la cafile=opción en el archivo de configuración npm. Primero, debe crear un archivo PEM que contenga información sobre sus certificados autofirmados. Si no sabe cómo hacerlo, aquí hay instrucciones para un entorno Windows sin utilizar software de terceros:

Necesitamos indicar explícitamente en qué certificados se debe confiar porque estamos usando certificados autofirmados. Para mi ejemplo, navegué a www.google.com usando Chrome para poder obtener los certificados.

En Chrome, vaya a Inspeccionar -> Seguridad -> Ver certificado. Verá todos los certificados que permiten la conexión SSL. Observe cómo estos certificados son autofirmados. La parte borrosa es mi compañía, y no somos una Autoridad Certificada. Puede exportar la ruta completa del certificado como un archivo P7B, o puede exportar los certificados individualmente como archivos CER (codificación base64). Exportar la ruta completa como P7B no le hace mucho bien porque a su vez tendrá que abrir este archivo en un administrador de certificados y exportar como archivos CER individuales de todos modos. En Windows, al hacer doble clic en el archivo P7B, se abrirá la aplicación Administrador de certificados.

ingrese la descripción de la imagen aquí

Exportar como CER (Base 64) es realmente un archivo de texto en el siguiente formato:

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

Para crear nuestro archivo PEM, simplemente necesitamos apilar estos certificados uno encima del otro en un solo archivo y cambiar la extensión a .pem. Usé el bloc de notas para hacer esto.

Apila los certificados en orden inverso desde la ruta del certificado. Así que arriba, comenzaría con * .google.com y luego pegaría Websense debajo de él, luego emitiría CA 1, etc. De esta manera, los certificados se analizan de arriba a abajo buscando la CA raíz apropiada. Simplemente incluir la CA raíz no funcionará, pero tampoco necesitamos incluir todos los certificados. De la ruta anterior, solo necesito incluir aquellos certificados que vienen antes del certificado de Websense (Emisión de CA 1, Política CA, CA raíz).

Una vez que estos certificados autofirmados se guardan en un archivo PEM, estamos listos para indicarle a npm que use estos certificados como nuestra CA confiable. Simplemente configure el archivo de configuración y debería estar listo para comenzar:

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

Ahora, con sus proxies configurados (http y https), y el registro configurado en https://registry.npmjs.org, debería poder instalar paquetes detrás de un firewall corporativo con certificados autofirmados sin modificar la strict-sslconfiguración.

John Galt
fuente
6

Puede verificar Fiddler si NPM está dando un error de autenticación. Es fácil de instalar y configurar. Establezca la regla del violinista en autenticado automáticamente. En .npmrc establezca estas propiedades

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

Funcionó para mí :)

Rakesh Sharma
fuente
Sorprendentemente, ninguna de las configuraciones que utilicé para mi proxy funcionó, utilicé esto y abrí el violinista y pude usarlo bien ...
Roberto
5

Pruebe esto, configure el proxy en npm de la siguiente manera

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
fuente
4

Obtendrá el host proxy y el puerto del administrador o soporte de su servidor.

Después de eso configurar

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

Si hay algún carácter especial en la contraseña, intente con% urlencode. Por ejemplo: - la libra (hash) debe reemplazarse por% 23.

Esto funcionó para mí ...

Shamseer
fuente
3

Simplemente cree un archivo llamado .npmrc en la carpeta de su proyecto, evitará la configuración del proxy a nivel del 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>

Comenta así si no usas el 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
fuente
3

Ninguna de las respuestas existentes explican cómo usar npm con un archivo PAC. Algunos sugieren descargar el archivo PAC, inspeccionarlo manualmente y elegir una de las cadenas "PROXY ...". Pero esto no funciona si el archivo PAC necesita elegir entre varios servidores proxy o si el archivo PAC contiene una lógica compleja para omitir servidores proxy para ciertas URL.

Además, algunos proxies corporativos requieren autenticación NTLM. CNTLM puede manejar la autenticación, pero no admite archivos PAC.

Una alternativa es utilizar Alpaca , que ejecuta el archivo PAC en una máquina virtual JavaScript y realiza la autenticación NTLM con el proxy resultante.

usuario1031921
fuente
2

Si está detrás de una red corporativa con proxy, acabo de usar una herramienta de proxy ntlm y usé el puerto y el proxy provistos por ntlm, por instinto usé esta configuración:

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

Espero que esto ayude.

yunieski dieguez garcia
fuente
2

Utilice el siguiente comando en cmd o GIT Bash u otro indicador

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

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

donde 192.168.1.101 es proxy ip y 4128 es puerto. cambie de acuerdo con su configuración de proxy.

Pankaj
fuente
2

Debe usar "npm config set http-proxy "

utilizar:

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
fuente
1

En el trabajo usamos ZScaler como nuestro proxy. La única forma en que pude hacer que npm funcionara fue usando Cntlm .

Ver esta respuesta:

NPM detrás del proxy NTLM

bruceceng
fuente
1

Prueba esto, fue lo único que funcionó para mí:

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

Presta atención a la opción --strict-ssl false

Buena suerte.

Matías Dell'Oso
fuente
1

La configuración del proxy NPM mencionada en la respuesta aceptada resuelve el problema, pero como puede ver en este problema de npm , algunas dependencias usan GIT y eso hace que la configuración del proxy git sea necesaria , y se puede hacer de la siguiente manera:

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

La configuración del proxy NPM mencionó:

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
fuente
0

Tuve un problema similar y probé todas las soluciones anteriores, pero ninguna funcionó para mí (estaba usando caracteres especiales (como el símbolo '@') en mi contraseña y también necesitaba agregar un nombre de dominio).

Aparte de eso, estaba un poco aprensivo para agregar mi contraseña como texto sin formato. Resultó que la solución más fácil para superar todos estos desafíos era usar algún tipo de proxy inverso (como Fiddler).

Ya he detallado los pasos de configuración en esta respuesta en SO.

Karthik
fuente
0

Agregar las líneas a continuación en el archivo .typingsrc me ayudó.

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

Me encontré con un problema similar y descubrí que mi archivo de configuración npm (.npmrc) tiene una entrada de registro incorrecta. comentó y volvió a ejecutar npm install. funcionó.

Ravi Siva Prasad M
fuente
0

SO: Windows 7

Pasos que me funcionaron:

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

  3. Comentarios: ejecuté este comando para conocer mi configuración 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
fuente
0

Debido a que todavía tengo problemas para establecer la configuración del proxy en el trabajo y desactivarla en casa, he escrito y publicado npm-corpo-proxy.sh . En cada corporación, la contraseña debe cambiarse con frecuencia y debe contener caracteres especiales, que deben codificarse antes de alimentar npm config (lo mismo para el dominio de forma de retroceso \ usuario).

Maciek Leks
fuente
0

De una pequeña búsqueda en Google, lo primero que probé fue esto

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

Pero aún así, npm parecía perder la conexión al intentar hacer "npm install" s. luego ejecuté esta línea en el símbolo del sistema y ahora puedo usar npm install

set NODE_TLS_REJECT_UNAUTHORIZED=0
Barkin Kaplan
fuente
0

No pude hacerlo funcionar con el CNTLM. Intenté seguir toda la información publicada anteriormente, pero el proxy aún no autorizó la conexión. Con Fiddler, solo tiene que instalarlo y marcar la opción Autenticado automáticamente. Pero para trabajar, tuve que eliminar el archivo .npmrc de mi carpeta de usuario y establecer las variables de entorno como se indica aquí , con estos valores:

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

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