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

Doc*_*Doc 145 proxy pac node.js npm 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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

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

有什么建议吗?谢谢

小智 189

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

我的用户名是"domain\username"形式 - 包括代理配置中的斜杠导致出现正斜杠.进入这个:

npm config set proxy "http://domain\username:password@servername:port/"
Run Code Online (Sandbox Code Playgroud)

然后运行它npm config get proxy返回: http:// domain/username:password @ servername:port /

因此,为了解决这个问题,我用URL编码了反斜杠,所以输入了这个:

npm config set proxy "http://domain%5Cusername:password@servername:port/"
Run Code Online (Sandbox Code Playgroud)

并且由此修复了代理访问.

  • 它导致你错过了%5C .key部分是C ....看到我把它隔开了 (5认同)
  • 对我有用的是首先清除**环境变量.使用**设置HTTP_PROXY =**和**设置HTTPS_PROXY =** (3认同)
  • 将`strict-ssl = false`添加到`.npmrc`配置文件中为我解决了公司代理 - 请参阅[@ ovidiu-buligan]的答案(http://stackoverflow.com/a/29173542/4013571)和[ @卡菲基恩-A](http://stackoverflow.com/a/39242772/4013571) (3认同)

Ovi*_*gan 60

认准的URL pac在Internet Explorer中局域网设置文件,并从配置的URL下载PAC文件.pac文件只是一个javascript文件,其函数名称FindProxyForURL在不同的场景中返回不同的代理主机.

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

proxy=http://<username>:<pass>@proxyhost:<port>
https-proxy=http://<uname>:<pass>@proxyhost:<port>
Run Code Online (Sandbox Code Playgroud)

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

不要忘记摆脱逃脱的特殊密码字符.


小智 48

下载您的.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
Run Code Online (Sandbox Code Playgroud)

现在你应该能够安装任何包!


KAR*_*N.A 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>

  • 只是要指出将 npm 的 __strict-ssl__ 设置为 __false__ 是一个安全问题。考虑在 npm 上正确设置 `ca[]` 属性。 (2认同)

Aar*_*n C 26

要扩展@Steve Roberts的答案.

我的用户名是"domain\username"形式 - 包括代理配置中的斜杠导致出现正斜杠.进入这个:

npm config set proxy "http://domain\username:password@servername:port/"
Run Code Online (Sandbox Code Playgroud)

我还必须对我的domain\user字符串进行URL编码,但是,我的用户名中有一个空格,所以我把一个+编码空间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"
Run Code Online (Sandbox Code Playgroud)

排除npm配置

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

问候.

WINDOWS环境变量(CMD提示)

更新

事实证明,即使使用上述配置,我仍然遇到一些使用Request - Simplified HTTP客户端内部下载内容的软件包/脚本的问题.因此,正如上面的自述文件所解释的那样,我们可以指定环境变量来在命令行上设置代理,而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
Run Code Online (Sandbox Code Playgroud)

cntlm

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

除了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  
    
    Run Code Online (Sandbox Code Playgroud)
    • 您将被要求输入密码:
     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:
    
    Run Code Online (Sandbox Code Playgroud)
  4. 您获得的输出cntlm -H将如下所示:

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

使用cntlm设置NPM

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

http://localhost:3128

使用正确的命令:

npm config set proxy http:// localhost:3128

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

必须设置npm CA证书

来自npm文档ca

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

基本步骤

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

问题

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


小智 7

我遇到了几个问题,最后我做了如下:

  1. 使用Fiddler,选择"自动验证"
  2. 在提琴手自定义规则中,我补充道

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

这很好.


Sha*_*eer 6

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

设置完之后

npm config set http_proxy http://username:password@proxyofmycomp.com:itsport
npm config set proxy http://username:password@proxyofmycomp.com:itsport
Run Code Online (Sandbox Code Playgroud)

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

这对我有用......


小智 6

如果 NPM 出现身份验证错误,您可以检查 Fiddler。它易于安装和配置。将 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
Run Code Online (Sandbox Code Playgroud)

它对我有用:)


Joh*_*alt 6

对于在公司防火墙后面挣扎以及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/
Run Code Online (Sandbox Code Playgroud)

快速的“陷阱”,对于安全请求和非安全请求,我的代理凭据都是相同的(请注意,对于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-----
Run Code Online (Sandbox Code Playgroud)

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

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

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

npm config set cafile "C:\yourcerts.pem"
Run Code Online (Sandbox Code Playgroud)

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


Moh*_*eer 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/"
Run Code Online (Sandbox Code Playgroud)