在公司代理.pac之后使用npm


158

我需要通过npm下载几个软件包,但我们的公司代理配置是.pac文件(我在Windows上)

我已经尝试过

npm config set proxy http://mydomain\username:password@1.2.3.4:8181/proxy.pac
npm config set https-proxy http://mydomain\username:password@1.2.3.4:8181/proxy.pac

要么

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

但这行不通...

有什么建议吗?谢谢



8
我不认为这个问题是重复的,pac脚本可以包含多个代理地址,具体取决于目标ip /主机地址,而dube仅处理1个代理地址- 来自评论
Ferrybig

1
没有一个答案表明如何使用pac脚本,该脚本可以包含多个代理地址,具体取决于目标ip /主机地址。谁能帮忙。
Partha Sarathi Ghosh

2
对我来说,它有助于打开proxy.pac文件以从中获取代理地址。(就我而言,我只需要将端口切换到8080)。
Nomad

@ParthaSarathiGhosh是的,没有一个答案实际上说明了如何使用PAC脚本,因此我添加了另一个解决此问题的答案:stackoverflow.com/a/61811444。已经晚了几年,但总比没有好?
user1031921

Answers:


204

我有一个非常类似的问题,我无法让npm在我们的代理服务器后面工作。

我的用户名格式为“域\用户名”-代理配置中的斜杠导致出现正斜杠。因此输入:

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

然后运行此命令npm config get proxy将返回以下内容: http:// domain / username:password @ servername:port /

因此,要解决此问题,我改为使用URL编码反斜杠,因此输入以下内容:

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

并且与此代理访问是固定的。


5
其原因是您错过了%5C .key部分,即C ....请参见我将其分隔为ya
sinisterrook

1
我刚刚更新了一些内容,代理又停止了工作。事实证明,在.npmrc文件的“代理”设置中(如下所述,@ Ovidiu Buligan),其中包含反斜杠的%5C,但“ https-proxy”仅包含“ \”。将此值也更改为%5C可以解决此问题。我相信这也可以通过运行更新NPM配置设置HTTP_PROXY“ 域% 5Cusername:密码@服务器:端口/”
史蒂夫·罗伯茨

1
我正在尝试在代理后面配置npm,但是有一种使用npm配置执行“ ping”的方法。因为如果我的conf错误,我的用户将在我的公司域上被屏蔽。
里卡多

3
对我有用的是首先清除织补环境变量。使用set HTTP_PROXY =设置HTTPS_PROXY =
Sydwell '16

4
将配置文件添加strict-ssl=false.npmrc公司代理后为我解决的问题-请参阅@ ovidiu-buligan@ karthikeyan-a的
Alexander McFarlane

64

pac在Internet Explorer局域网设置中查找文件的url,然后从配置的URL下载pac文件。pac文件只是一个JavaScript文件,其功能名为FindProxyForURL,可以在不同情况下返回不同的代理主机。

尝试在该pac文件中找到您认为适合一般网络流量的主机,然后将其插入.npmrc中 C:\Users\<username>\.npmrc

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

即使您可以在公司的计算机上使用域和用户名登录, 代理服务器也不需要用户活动目录域名,只需户名和密码(可能与您的Active Directory登录名不同)

不要忘记摆弄特殊的密码字符。


谢谢。我导航到.npmrc并更改设置。它奏效了
arn-arn

54

下载.pac文件。在任何编辑器中打开它,然后查找PROXY = "PROXY X.X.X.X:80;。您可能有很多代理,可以复制其中任何一个并运行以下终端命令:

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

现在您应该可以安装任何软件包了!


1
对于https-proxy部分,我必须对其执行“ ... set https-proxy = http:// ...”而不是“ ... set https-proxy http:// ...”工作。就是我的$ .02。
尼克,

感谢将https-proxy设置为http://是唯一有效的方法;在从bash取消设置http_proxy和https_proxy环境变量之后!
Alex Punnen

对于https-proxy,我无法设置为“ set https-proxy https:/.../”,我必须设置为“ set https-proxy http:// ...”(来自https的代理信息-> http)
火星,

git也是如此,git config --global http.proxy http://X.X.X.X:80 git config --global https.proxy http://X.X.X.X:80
代号Jack

38

我这样解决了这个问题:

1)我运行以下命令:

npm config set strict-ssl false

2)然后将npm设置为使用http而不是https运行:

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

3)然后安装您的软件包

npm install <package name>


2
仅指出将npm的strict-ssl设置为false是一个安全问题。考虑改为ca[]在npm上正确设置该 属性。
亚伦C

26

要扩展@Steve Roberts的答案。

我的用户名格式为“域\用户名”-代理配置中的斜杠导致出现正斜杠。因此输入:

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

我还必须对domain\user字符串进行URL编码,但是,我的用户名中有一个空格,因此我输入了a +来对空间URL编码进行编码,但是它将被双重编码为%2B(这是加号的URL编码,但是URL空格的编码是%20),因此我不得不执行以下操作:

npm命令

// option one 
// it works for some packages
npm config set http_proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x: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:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser name:password@x.x.x.x: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:password@x.x.x.x:port"
npm config set proxy "http://user name:password@x.x.x.x:port"

对npm config进行故障排除

我使用npm config list来获取我在上面设置的解析值,这就是我发现双重编码的方式。奇怪的。

本质上,您必须确定以下要求:

  1. DOMAIN验证所需的字符串
  2. 您需要编码特殊字符吗?
    • 空格和(@)符号特别具有挑战性

问候。

WINDOWS环境变量(CMD提示)

更新资料

事实证明,即使使用上述配置,我在内部仍使用Request-Simplified HTTP Client来下载内容的某些程序包/脚本仍然存在一些问题。因此,如以上自述文件所述,我们可以指定环境变量以在命令行上设置代理,而Request将接受这些值。

然后,在(并且我不愿意承认)几次尝试(更像是几天)之后,尝试设置环境变量,我终于成功遵循了以下准则:

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:password@x.x.x.x:port
SET HTTPS_PROXY=http://DOMAIN\user name:password@x.x.x.x:port

中央电视台

我使用上述技术达数周之久,直到意识到在需要代理设置的所有工具中更新密码的开销。

除了npm之外,我还使用:

  • 凉亭
  • 流浪汉
    • 虚拟盒(运行linux)
    • apt-get [Linux]
  • 吉特
  • vscode
  • 括号
  • 原子
  • tsd

cntlm设置步骤

因此,我安装了cntlm。设置cntlm非常正确,您需要查找ini文件@C:\Program Files\Cntlm\cntlm.ini

  1. 打开C:\Program Files\Cntlm\cntlm.ini(您可能需要管理员权限)
  2. 查找UsernameDomain行(我认为第8-9行)
    • 添加您的用户名
    • 添加您的域
  3. 在cmd提示符下运行:

    cd C:\Program Files\Cntlm\
    cntlm -M
    cntlm -H  
    • 您将被要求输入密码:
     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. 您从中获得的输出cntlm -H将类似于:

    PassLM          561DF6AF15D5A5ADG  
    PassNT          A1D651A5F15DFA5AD  
    PassNTLMv2      A1D65F1A65D1ASD51  # Only for user 'user name', domain 'DOMAIN'
    • 建议您使用PassNTLMv2,因此请添加#前一行PassLMPassNT或者不要使用它们
  5. 粘贴cntlm -Hini文件中的输出,替换PassLMPassNT和的行PassNTMLv2,或者注释原始行并添加您的行。
  6. 添加您的 Proxy服务器。如果您不知道什么是代理服务器,请执行以下操作,我通过在AutoConfigURL注册表中查找注册表项来查找代理自动配置文件HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings。导航到该URL,并浏览恰巧是JavaScript的代码。
  7. (可选)您可以通过更改以下内容来更改cntlm侦听的端口: Listen ####线路####的端口,其中端口号为。

使用Cntlm设置NPM

因此,您将npm指向您的cntml代理,您可以使用ip(我使用过的)localhost和cntlm的默认端口,3128因此我的代理url看起来像这样

http://localhost:3128

使用正确的命令:

npm config设置代理http:// localhost:3128

简单得多。您使用相同的URL设置所有工具,并且只在一个地方更新密码。生活没有那么简单。

必须设置npm CA证书

从NPM文档CA

如果您的公司代理使用自己的自签名证书拦截https连接,则必须避免 npm config set strict-ssl false (大不行)。

基本步骤

  1. 从浏览器获取证书(Chrome可以正常运行)。将其导出为Base-64编码的X.509(.CER)
  2. 用替换新行 \n
  3. 编辑您的.npmrc添加行ca[]="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"

问题

我注意到有时npm会挂起,所以我停止(有时是强制性的)cntlm并重新启动它。


7

我遇到了一些问题,最后我做了如下工作:

  1. 二手的提琴手,选择了“自动认证”
  2. 在提琴手自定义规则中,我添加了

    if (m_AutoAuth) {oSession["X-AutoAuth"] = "domain\\username:password";}
  3. 最后在npm中,将代理设置为http:// localhost:8888

这很好。


谢谢!像魅力一样工作!!我的情况是:用户名是“域/用户名”格式。密码中有一个“ @”。完全不需要进行任何URL编码/解码等操作
A_B 2015年

为我完美地工作。非常感谢。只是想指出,使用"domain\\username:password"会带来身份盗用的安全威胁。而是"(default)"在自定义规则中使用config可以很好地工作。使用“ npm”时,Fiddler需要运行。
pk10

7

对于在公司防火墙后面挣扎以及SSL问题(无法获得本地发行者证书)的任何人,您可以尝试以下一些步骤:

忘记SSL

如果您不关心SSL,则可以通过设置代理并将注册表更改为非安全版本来遵循许多以前的贡献者的建议:

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/

快速的“陷阱”,我的代理凭据对于受保护的请求和不受保护的请求都是相同的(请注意,对于https-proxy,我如何将协议保留为http://配置,)。这可能对您来说是相同的,但事实并非如此。

我想保留SSL

如果您想保留SSL,并且不想使用strict-ssl=false,那么您还有更多工作要做。对我来说,我位于公司防火墙后面,并且我们使用的是自签名证书,因此我收到了错误消息unable to get local issuer certificate。如果您和我在同一条船上,那么您需要设置cafile=在npm config文件中选项。首先,您需要创建一个PEM文件,其中包含有关您的自签名证书的信息。如果您不知道如何执行此操作,则以下是不使用第三方软件的Windows环境说明:

因为我们使用的是自签名证书,所以我们需要明确指出应该信任哪些证书。在我的示例中,我使用Chrome浏览到www.google.com,因此可以获取证书。

在Chrome中,转到检查->安全->查看证书。您将看到所有允许SSL连接的证书。注意这些证书是如何自签名的。模糊的部分是我的公司,我们不是认证机构。您可以将完整的证书路径导出为P7B文件,也可以将证书分别导出为CER文件(base64编码)。将完整路径导出为P7B并没有多大好处,因为您将需要依次在证书管理器中打开此文件并导出为单个CER文件。在Windows中,双击P7B文件将打开证书管理器应用程序。

在此处输入图片说明

导出为CER(Base 64)实际上是以下格式的文本文件:

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

要创建我们的PEM文件,我们只需要将这些证书彼此堆叠到单个文件中,并将扩展名更改为.pem。我用记事本来做。

您从证书路径以相反的顺序堆叠证书。因此,在上面,我将从* .google.com开始,然后将Websense粘贴在其下,然后颁发CA 1等。这样,将证书从上到下解析,以搜索适当的根CA。仅包括根CA无效,但是我们也不需要包括所有证书。通过上面的路径,我只需要包含Websense证书之前的那些证书(颁发CA 1,策略CA,根CA)。

将这些自签名证书保存到PEM文件后,我们准备指示npm将这些证书用作我们的受信任CA。只需设置配置文件,您就可以进行以下工作:

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

现在,将代理设置为(http和https),并将注册表设置为https://registry.npmjs.org,您应该能够在不使用strict-ssl设置的情况下使用自签名证书在公司防火墙后面安装软件包。


6

您可以检查Fiddler是否NPM给出了身份验证错误。易于安装和配置。将Fiddler Rule设置为Automatically Authenticated。在.npmrc中设置这些属性

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

它对我有用:)


令人惊讶的是,我用于代理的任何配置均不起作用,我使用了该配置并打开了提琴手,就可以使用它了……
Roberto

5

试试这个,如下所示在npm中设置代理

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/"

4

您将从服务器管理员或支持人员那里获得代理主机和端口。

在建立之后

npm config set http_proxy http://username:password@proxyofmycomp.com:itsport
npm config set proxy http://username:password@proxyofmycomp.com:itsport

如果密码中有任何特殊字符,请尝试使用%urlencode。例如:-英镑(哈希)替换为%23。

这对我有用...


3

只需在您的项目文件夹中创建一个名为.npmrc的文件,它将避免在系统级别进行代理设置

#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>

如果您不使用代理,请像这样发表评论

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

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

3

现有答案均未解释如何将npm与PAC文件一起使用。有人建议下载PAC文件,手动检查它,然后选择“ PROXY ...”字符串之一。但是,如果PAC文件需要从多个代理中进行选择,或者PAC文件包含复杂的逻辑以绕过某些URL的代理,则此方法将无效。

另外,某些公司代理需要NTLM身份验证。CNTLM可以处理身份验证,但不支持PAC文件。

一种替代方法是使用Alpaca,它在JavaScript VM中执行PAC文件,并使用生成的代理执行NTLM身份验证。


2

如果您位于具有代理服务器的公司网络后面,那么我只是使用了ntlm代理工具,并使用了ntlm提供的端口和代理,因此我使用了以下配置:

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

我希望这有帮助。


2

在cmd或GIT Bash或其他提示下使用以下命令

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

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

其中192.168.1.101是代理IP,而4128是端口。根据您的代理设置进行更改。


2

您必须使用“ npm config set http-proxy

用:

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


1

试试这个,这是唯一对我有用的方法:

npm --proxy http://:@proxyhost:--https-proxy http://:@proxyhost:--strict-ssl错误安装-g软件包

注意选项--strict-ssl false

祝好运。


1

接受的答案中提到的NPM代理设置解决了该问题,但是正如您在npm问题中所看到的,某些依赖项使用GIT,这使得需要进行git代理设置,可以按照以下步骤进行操作:

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

NPM代理设置提到:

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/"

0

我遇到了类似的问题,我尝试了上述所有解决方法,但没有一个对我有用(我在密码中使用了特殊字符(例如'@'符号),还需要添加域名)。

除此之外,我有点担心将密码添加为纯文本。事实证明,克服所有这些挑战的最简单解决方案是使用某种反向代理(例如Fiddler)。

我已经在SO的答案中详细介绍了配置步骤。


0

在.typingsrc文件中添加以下几行对我有帮助。

{
    "rejectUnauthorized": false,
    "registryURL" :"http://api.typings.org/"
 }


0

作业系统: Windows 7

对我有用的步骤:

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

  3. 注释:我执行此命令以了解我的代理设置
    npm config rm proxy

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

0

由于我仍然无法在工作中设置代理设置并在家中关闭代理设置,因此我编写了脚本并发布了npm-corpo-proxy.sh。在每个corpo中,密码都必须经常更改,并且必须包含特殊字符,必须在馈送npm config之前对它们进行编码(对于backash形式domain \ user而言,该字符相同)。


0

通过谷歌的一点搜索,我尝试的第一件事是

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

但是,当尝试执行“ npm install”时,npm似乎仍然失去连接。然后我在命令提示符下运行了这一行,现在我可以使用npm install

set NODE_TLS_REJECT_UNAUTHORIZED=0

0

我无法使其与CNTLM一起使用。我尝试遵循上面发布的所有信息,但是代理仍然未授权连接。使用Fiddler,您只需要安装它并选中“自动身份验证”选项。但是要工作,我必须从用户文件夹中删除.npmrc文件,并按以下指示使用以下值设置环境变量

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

set npm_config_registry="http://registry.npmjs.org/"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.