在企业代理.pac 后使用 npm

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

但是没有用。

有什么建议吗? 谢谢

366731 次浏览

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

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

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

我的用户名是“ domain username”形式的——包括代理配置中的斜杠,结果出现一个正斜杠。输入这个:

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

这样代理访问就被修复了。

在 Internet Explorer 局域网设定中寻找 pac档案的网址,并从已设定的网址下载 pac 档案。 Pac 文件只是一个 javascript 文件,带有一个名为 FindProxyForURL的函数,它在不同的场景中返回不同的代理主机。

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

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

即使您可以在您的企业机器 代理很可能不需要用户活动目录域名上使用您的域名和用户名登录,也只能使用用户名和密码(这可能与您的 ActiveDirectory 登录不同)

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

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

在那之后

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

如果密码中有任何特殊字符,请尝试使用% urlencode。

这招对我很管用。

详述@Steve Roberts 的回答。

我的用户名是“ domain username”格式的——包括 代理配置导致出现一个斜杠 输入这个:

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

我还必须对我的 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"


// 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 配置故障排除

我使用 npm config list来获得上面设置的解析值,这就是我如何发现双重编码的。真奇怪。

基本上,你必须弄清楚以下要求:

  1. 身份验证所需的 DOMAIN字符串
  2. 需要对特殊字符进行编码吗?
    • 空格和 at (@)标志特别具有挑战性

问候。

窗口环境变量(CMD 提示符)

更新

事实证明,即使使用上述配置,我仍然对一些在内部使用 请求-简化 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

中文字幕

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

除了 npm,我还使用:

  • 鲍尔
  • 流浪汉
    • 虚拟机(运行 Linux)
    • Apt-get [ linux ]
  • 饭桶
  • VScode
  • 括号
  • 原子
  • 性病

安装步骤

所以,我安装了 中文字幕。设置 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 -H的输出粘贴到 ini 文件中,替换 PassLMPassNTPassNTMLv2的行,或者注释原始行并添加您的行。
  6. 添加 Proxy服务器。如果你不知道代理服务器是什么... 做我所做的,我寻找我的代理自动配置文件通过寻找 AutoConfigURL注册表密钥在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings。导航到该 URL 并查看恰好是 JavaScript 的代码。
  7. 您也可以通过更改 Listen ####行来更改 cntlm 监听的端口,其中 ####是端口号。

使用 cntlm 设置 NPM

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

http://localhost:3128

只要有正确的指挥:

Npm 配置集代理 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 会挂起,所以我停止(有时强制) 中文字幕并重新启动它。

我在这方面遇到了一些问题,最后我做了以下几点:

  1. 使用 Fiddler,选择“自动身份验证”
  2. 在小提琴手的自定义规则中,我添加了

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

This worked fine.

我也遇到过类似的问题,我尝试了上面所有的解决方案,但没有一个对我有用(我在密码中使用了特殊的字符(比如’@’符号) ,而且我还需要添加域名)。

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

我已经详细说明了 这个答案中的配置步骤。

如果您使用代理服务器支持企业网络,我只是使用了 ntlm 代理工具,并使用了 ntlm 提供的端口和代理,例如,我使用了以下配置:

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

希望这个能帮上忙。

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

看看这个答案:

NTLM 代理后面的 NPM

如果 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

这对我很有效:)

在 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是端口。根据您的代理设置更改。

在. typeingsrc 文件中添加下面的行对我有帮助。

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

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

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 配置文件(。Npmrc)有错误的注册表项。注释掉它,然后重新运行 npm install。成功了。

操作系统: 视窗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

必须使用“ npm 配置集 代理服务器

用途:

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

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

Npm-代理 http://:@proxyhost : —— https-代理 http://:@proxyhost : —— strong-ssl false install-g package

请注意这个选项—— strong-ssl false

祝你好运。

对于任何在公司防火墙后挣扎的人,以及 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- 代理服务器配置的)。这对你来说可能是一样的,也可能不是。

我想保留 SSL

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

我们需要显式地指出应该信任哪些证书,因为我们使用的是自签名证书。例如,我使用 Chrome 浏览器导航到 www.google.com,这样我就可以获取证书。

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

enter image description here

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

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

要创建 PEM 文件,我们只需将这些证书叠加到一个文件中,然后将扩展名更改为。Pem.我用记事本做的。

您按照与证书路径相反的顺序堆栈证书。所以上面,我会从 * . google.com 开始,然后在下面粘贴 Websense,然后发布 CA 1等等。通过这种方式,从顶部到底部解析证书,搜索适当的根 CA。简单地包含 RootCA 将不起作用,但是我们也不需要包含所有的证书。从上面的路径,我只需要包含 Websense 证书之前的那些证书(颁发 CA 1、策略 CA、根 CA)。

一旦将这些自签名的证书保存到 PEM 文件中,我们就可以指示 npm 将这些证书用作我们可信的 CA。只需设置配置文件,就可以开始了:

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

现在,通过设置代理(http 和 https) ,并将注册表设置为 https://registry.npmjs.org,您应该能够在具有自签名证书的公司防火墙后面安装软件包,而无需关闭 strict-ssl设置。

尝试这样做,在 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/"

因为在工作时设置代理设置和在家中关闭代理设置仍然存在问题,所以我编写了脚本并发布了 Npm-corpo-proxy.sh。在每个公司的密码必须经常更改,并且必须包含特殊的字符,这必须在提供 npm 配置之前进行编码(对于反灰表单域用户也是如此)。

在谷歌上搜索一下,我尝试的第一件事是这样的 < br > < br >

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

在已接受的答案中提到的 NPM代理设置解决了这个问题,但是正如您在 这是一个 href = “ https://github.com/npm/npm/questions/3559”rel = “ nofollow noReferrer”> npm problem 中看到的,一些依赖项使用 GIT,使得 需要 git 代理设置成为 需要 git 代理设置,并且可以按照以下方式完成:

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

提到的国家预防机制代理设置:

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

我不能和 CNTLM 合作。我尝试跟踪上面发布的所有信息,但是代理仍然没有授权连接。使用 Fiddler,您只需要安装它并检查 AutomativeAuthenticated 选项。但是为了工作,我必须移除。我的用户文件夹中的 npmrc 文件和 如下所示设置环境变量,其值如下:

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


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

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

现有的答案都没有解释如何在 PAC 文件中使用 npm。有人建议下载 PAC 文件,手动检查它,然后选择 但是如果 PAC 文件需要从中进行选择,那么这个函数就不起作用了 多个代理,或者 PAC 文件包含绕过代理的复杂逻辑 某些网址。

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

另一种方法是使用 羊驼,它在 JavaScriptVM,并使用生成的代理执行 NTLM 身份验证。

不要忘记使用 URL 编码作为密码。

假设你的用户名 = “ xyz” Pwd = “ abc # 11”

那么你的 C: Users < username > . npmrc 应该是这样的

代理人 = http://domainname%5cxyz:abc%2311@servername:port

Servername: 可以从 Internet Explorer 的 pac 文件中获得。

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

我知道这里有很多答案,但是老实说,对于每个组织,什么工作可能会有所不同。我有这个问题,通过尝试和错误,我能够得到以下工作。

注意,在这个配置中没有使用密码,它仍然工作得很好。

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

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: