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

时间:2014-09-04 08:40:07

标签: node.js npm proxy pac npm-config

我需要通过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

但它不起作用......

有什么建议吗?感谢

27 个答案:

答案 0 :(得分:173)

我遇到了一个非常类似的问题,我无法让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/"

并且通过这种方式修复了代理访问。

答案 1 :(得分:54)

在Internet Explorer的LAN设置中查找pac文件的网址,并从配置的网址下载pac文件。 pac文件只是一个javascript文件,其函数名为FindProxyForURL,它在不同的场景中返回不同的代理主机。

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

中的.npmrc
proxy=http://<username>:<pass>@proxyhost:<port>
https-proxy=http://<uname>:<pass>@proxyhost:<port>

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

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

答案 2 :(得分:43)

下载您的.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

现在你应该可以安装任何包了!

答案 3 :(得分:35)

我用这种方式解决了这个问题:

1)我运行此命令:

npm config set strict-ssl false

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

运行

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

3)然后安装你的包

npm install <package name>

答案 4 :(得分:24)

扩展@Steve Roberts的答案。

  

我的用户名是“域\用户名”形式 - 包括斜杠   代理配置导致出现正斜杠。所以   进入这个:

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

我还必须对我的domain\user字符串进行URL编码,但是,我的用户名中有一个空格,所以我放了一个+来编码空格URL编码,但它会被编码为{{ {1}}(这是加号的URL编码,但空格的URL编码是%2B),因此我必须执行以下操作:

npm命令

%20

故障排除npm config

我使用//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" 来获取上面设置的解析值,这就是我发现双重编码的方法。怪异。

问候。

WINDOWS环境变量(CMD提示)

更新

事实证明,即使使用上述配置,我仍然遇到一些在内部使用Request - Simplified HTTP client下载内容的软件包/脚本的问题。因此,正如上面的自述文件所解释的那样,我们可以指定环境变量来在命令行上设置代理,而Request将遵循这些值。

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

npm config list

cntlm

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

除了npm,我还使用:

  • 亭子
  • 流浪汉
    • 虚拟框(运行linux)
    • apt-get [linux]
  • GIT中
  • vscode
  • 括号
  • 原子
  • TSD

cntlm设置步骤

所以,我安装了cntlm。设置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 非常明确,您需要查找ini文件@ cntlm

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

    Domain
    • 您将被要求输入密码:
    cd C:\Program Files\Cntlm\
    cntlm -M
    cntlm -H  
    
  4. 您从 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: 获得的输出将如下所示:

    cntlm -H
    • 建议您使用PassNTLMv2,因此在行PassLM 561DF6AF15D5A5ADG PassNT A1D651A5F15DFA5AD PassNTLMv2 A1D65F1A65D1ASD51 # Only for user 'user name', domain 'DOMAIN' #之前添加PassLM或不使用它们
  5. PassNT的输出粘贴到ini文件中,替换cntlm -HPassLMPassNT的行,或者注释原始行并添加您的行。
  6. 添加PassNTMLv2台服务器。如果你不知道代理服务器是什么......做我做的,我通过在Proxy中查找AutoConfigURL注册表项来查找我的代理自动配置文件。导航到该URL并查看恰好是JavaScript的代码。
  7. Optionaly您可以通过更改HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings行来更改cntlm侦听的端口,其中Listen ####是端口号。
  8. 使用cntlm

    设置NPM

    所以,你将npm指向你的cntml代理,你可以使用ip,我使用####和cntlm localhost的默认端口,所以我的代理网址看起来像这样

      

    3128

    使用正确的命令:

      

    npm config set proxy http://localhost:3128

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

    必须设置npm CA证书

    来自npm文档ca

    如果您的公司代理使用自己的自签名证书拦截https连接,则必须避免 http://localhost:3128 (大禁忌)。

    基本步骤

    1. 从您的浏览器获取证书(Chromes效果很好)。将其导出为 Base-64编码的X.509(.CER)
    2. npm config set strict-ssl false
    3. 替换新行
    4. 修改您的\n添加一行.npmrc
    5. 问题

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

答案 5 :(得分:6)

I had run into several issues with this and finally what I did is as follows:

  1. Used Fiddler, with "Automatically Authenticate" selected
  2. In fiddler custom rules, i added

    if (m_AutoAuth) {oSession["X-AutoAuth"] = "domain\\username:password";}
    
  3. Finally in npm i set the proxy to http://localhost:8888

This worked fine.

答案 6 :(得分:4)

对于在公司防火墙后面苦苦挣扎的人,以及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/

这里有一个快速的“问题”,我的代理凭据对于安全和非安全请求是相同的(请注意我的协议如何 http:// 用于 https-proxy 配置)。这对你来说可能是一样的,也可能没有。

我想保留SSL

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

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

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

enter image description here

导出为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设置。

答案 7 :(得分:4)

如果NPM提供身份验证错误,您可以检查Fiddler。它易于安装和配置。将Fiddler规则设置为自动Authenticated.In .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

它对我有用:)

答案 8 :(得分:3)

试试这个,在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/"

答案 9 :(得分:3)

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

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

另一种方法是使用Alpaca,它会在 JavaScript VM,并使用生成的代理执行NTLM身份验证。

答案 10 :(得分: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是端口。根据您的代理设置进行更改。

答案 11 :(得分: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

答案 12 :(得分:2)

如果您是使用代理的公司网络的后面,我只是使用了一个ntlm代理工具并使用了ntlm提供的端口和代理,因为我使用了这种配置:

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

我希望这会有所帮助。

答案 13 :(得分:2)

您将从服务器管理员或支持部门获取代理主机和端口。

在设置之后

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

如果密码中有任何特殊字符,请尝试使用%urlencode。例如: - 磅(哈希)shuold被%23取代。

这对我有用......

答案 14 :(得分:1)

在工作中我们使用ZScaler作为我们的代理。我能够让npm工作的唯一方法是使用Cntlm

看到这个答案:

NPM behind NTLM proxy

答案 15 :(得分:1)

试试这个,这是唯一对我有用的东西:

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

请注意选项--strict-ssl false

祝你好运。

答案 16 :(得分:1)

已接受的答案中提到的 NPM 代理设置解决了该问题,但是正如您在npm issue 中看到的那样,某些依赖项使用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/"

答案 17 :(得分:0)

别忘了使用URL编码作为密码。

假设您的用户名=“ xyz” pwd =“ abc#11”

然后您的C:\ Users <用户名> .npmrc应该像

proxy = http://域名%5Cxyz:abc%2311 @ servername:port

服务器名:可以从Internet Explorer的pac文件中获取。

答案 18 :(得分:0)

密码可能是可选的,并非总是需要。

我知道这里有很多答案,但老实说,每个组织的工作方式可能会有所不同。我遇到了这个问题,通过反复试验,我能够使以下内容正常工作。

请注意,此配置中没有使用密码,但它仍然可以正常工作。

直接编辑 .npmrc 目录中的 C:\Users\your-username\ 文件并应用下面的设置。请记住打开一个新的命令提示符会话以反映更改。

proxy=http://http.proxy.xxx.com:8000
registry=http://registry.npmjs.org/
strict-ssl=false

其中 xxx 是我公司的名称。您不能在此处直接配置您的代理 URL,但您可以在文本编辑器中打开该文件并找到要使用的适当主机名和端口号。

Here is how it looks, to get an idea:

答案 19 :(得分:0)

只需在您的项目文件夹中创建一个名为.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>

答案 20 :(得分:0)

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

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

set npm_config_registry="http://registry.npmjs.org/"

答案 21 :(得分:0)

通过Google的一点搜索,我尝试的第一件事就是这个

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

答案 22 :(得分:0)

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

答案 23 :(得分: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

答案 24 :(得分:0)

我遇到了类似的问题,发现我的npm配置文件(.npmrc)有错误的注册表项。评论出来并重新运行npm install。它奏效了。

答案 25 :(得分:0)

在.typingsrc文件中添加以下行有助于我。

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

答案 26 :(得分:0)

我有一个类似的问题,我尝试了上面的所有解决方法,但它们都没有为我工作(我在我的密码中使用特殊字符(如&#39; @&#39;符号),我还需要添加域名)。

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

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