ChatGPT解决这个技术问题 Extra ChatGPT

在公司代理 .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

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

有什么建议吗?谢谢

我不认为这个问题是重复的,pac 脚本可以包含多个代理地址,具体取决于目标 ip/主机地址,而 dube 只处理 1 个代理地址 - From review
没有一个答案表明如何使用可以包含多个代理地址的 pac 脚本,具体取决于目标 IP/主机地址。任何人都可以帮忙吗?
对我来说,它有助于打开 proxy.pac 文件以从中获取代理地址。 (在我的情况下,我只需将端口切换到 8080)。
@ParthaSarathiGhosh 你是对的,没有一个答案真正解释了如何使用 PAC 脚本,所以我添加了另一个答案来解决这个问题:stackoverflow.com/a/61811444。晚了几年,但迟到总比没有好?

L
Liam

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

有了这个代理访问是固定的。


它的原因是你错过了 %5C .key 部分是 C ....看到我把它隔开给你
我刚刚更新了一些东西,我的代理再次停止工作。事实证明,在 .npmrc 文件的“代理”设置中(如下文@Ovidiu Buligan 所述),它包含反斜杠的 %5C,但“https-proxy”只包含“\”。将其更改为也由 %5C 解决了问题。我认为这也可以通过运行 npm config set http_proxy "domain% 5Cusername:password@servername:port/" 来更新
我正在尝试在代理后面配置 npm,但是有一种方法可以使用 npm 配置进行“ping”。因为如果我的 conf 错误,我的用户将在我的公司域中被阻止。
对我有用的是首先清除该死的环境变量。使用 set HTTP_PROXY= 并设置 HTTPS_PROXY=
strict-ssl=false 添加到 .npmrc 配置文件解决了我在公司代理后面的问题 - 请参阅来自 @ovidiu-buligan@karthikeyan-a 的答案
O
Ovidiu Buligan

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

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

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

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

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


o
oikonomopo

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

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


对于 https-proxy 部分,我必须执行“... set https-proxy=http://...”而不是“... set https-proxy http://...”工作。只是我的 0.02 美元。
感谢将 https-proxy 设置为 http:// 是唯一有效的方法;在我从 bash 中取消设置 http_proxy 和 https_proxy 环境变量之后!
对于 https-proxy,我无法设置为“设置 https-proxy https://.../”,我必须设置为“设置 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
K
KARTHIKEYAN.A

我这样解决了这个问题:

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[] 属性。
A
Aaron C

扩展@Steve Roberts 的答案。

我的用户名采用“域\用户名”的形式 - 包括代理配置中的斜杠会导致出现正斜杠。所以输入这个: 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 来获取我在上面设置的解析值,这就是我发现双重编码的方式。诡异的。

本质上,您必须弄清楚以下要求:

身份验证是否需要 DOMAIN 字符串 是否需要对特殊字符进行编码?空格和 at (@) 标志特别具有挑战性

问候。

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

cntlm

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

除了 npm,我还使用:

凉亭

vagrant virtual box (运行 linux) apt-get [linux]

虚拟盒子(运行linux)

apt-get [Linux]

混帐

代码

括号

原子

tsd

cntlm 设置步骤

所以,我安装了 cntlm。设置 cntlm 非常简单,您可以查找 ini 文件 @ C:\Program Files\Cntlm\cntlm.ini

打开 C:\Program Files\Cntlm\cntlm.ini (您可能需要管理员权限)查找用户名和域行(我认为第 8-9 行)添加您的用户名添加您的域在 cmd 提示符下运行:cd C:\Program Files \Cntlm\ cntlm -M cntlm -H 您将被要求输入密码:cygwin 警告:检测到 MS-DOS 样式路径:C:\Program Files\Cntlm\cntlm.ini 首选 POSIX 等效项是:/Cntlm/cntlm.ini CYGWIN环境变量选项“nodosfilewarning”关闭此警告。有关 POSIX 路径的更多详细信息,请参阅用户指南:http://cygwin.com/cygwin-ug-net/using.html#using-pathnames 密码:您从 cntlm -H 获得的输出类似于: PassLM 561DF6AF15D5A5ADG PassNT A1D651A5F15DFA5AD PassNTLMv2 A1D65F1A65D1ASD51 # Only for user 'user name', domain 'DOMAIN' 建议您使用 PassNTLMv2 所以在 PassLM 和 PassNT 行之前添加 # 或不使用它们 将 cntlm -H 的输出粘贴到 ini 文件上,替换PassLM、PassNT 和 PassNTMLv2 的行,或注释原始行并添加您的行。添加您的代理服务器。如果您不知道代理服务器是什么... 照我的做法,我通过在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet 设置中查找 AutoConfigURL 注册表项来查找我的代理自动配置文件。导航到该 url 并查看恰好是 JavaScript 的代码。可选地,您可以通过更改 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(大禁忌)。

基本步骤

从浏览器获取证书(Chrome 运行良好)。将其导出为 Base-64 编码的 X.509 (.CER) 将新行替换为 \n 编辑您的 .npmrc 添加一行 ca[]="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n -----结束证书-----"

问题

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


在 Windows 上,cntlm 的替代方法是 github.com/genotrance/px
S
Shoel Palli

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

使用 Fiddler,选择“自动验证”在提琴手自定义规则中,我添加了 if (m_AutoAuth) {oSession["X-AutoAuth"] = "domain\\username:password";} 最后在 npm 我将代理设置为 http: //本地主机:8888

这工作得很好。


谢谢!像魅力一样工作!我的场景:用户名是“域/用户名”格式。密码中有一个“@”。根本不需要做任何 URL 编码/解码等
非常适合我。太感谢了。只是想指出,使用 "domain\\username:password" 可能会构成身份盗窃的安全威胁。相反,在自定义规则中使用 "(default)" 配置效果很好。 Fiddler 需要在您使用“npm”时运行才能正常工作。
@pk10 嘿,只是想知道这实际上是如何工作的?
R
Rakesh Sharma

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

它对我有用:)


令人惊讶的是,我用于代理的所有配置都不起作用,我使用它并打开提琴手,我可以很好地使用它......
J
Josh Weston

对于任何在公司防火墙后苦苦挣扎的人,以及 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 中,转到检查 -> 安全 -> 查看证书。您将看到所有允许 SSL 连接的证书。注意这些证书是如何自签名的。模糊的部分是我的公司,我们不是认证机构。您可以将完整的证书路径导出为 P7B 文件,也可以将证书单独导出为 CER 文件(base64 编码)。将完整路径导出为 P7B 对您没有多大好处,因为您反过来需要在证书管理器中打开此文件并导出为单独的 CER 文件。在 Windows 中,双击 P7B 文件将打开证书管理器应用程序。

https://i.stack.imgur.com/QdbGJ.png

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


S
Shamseer

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

之后设置

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

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

这对我有用...


M
Mohammed Safeer

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

V
Vinayak Shedgeri

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

u
user1031921

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

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

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


v
vikkee

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

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

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

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

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

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

https://i.stack.imgur.com/4IEYQ.png


y
yunieski dieguez garcia

如果您在带有代理的公司网络后面,我只是使用了 ntlm 代理工具并使用了 ntlm 提供的端口和代理,因为我使用了以下配置:

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

我希望这有帮助。


C
CDspace

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


J
Júnior Mendonça

您必须使用“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

M
Matías Dell'Oso

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

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

注意选项--strict-ssl false

祝你好运。


C
Community

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

看到这个答案:

NPM behind NTLM proxy


B
Barkin Kaplan

从谷歌上的一个小搜索中,我尝试的第一件事就是这个

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

J
Josiel Faleiros

接受的答案中提到的 NPM 代理设置解决了这个问题,但正如您在 this 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/"

将 strict-ssl 设置为 false 是一个坏主意,因为您不知道您的安全通信是否已被破坏。
G
Guilherme Pereira

我无法让它与 CNTLM 一起工作。我尝试按照上面发布的所有信息进行操作,但代理仍然没有授权连接。使用 Fiddler,您只需安装它并选中 Automatically Authenticated 选项。但要工作,我必须从我的用户文件夹和 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/"

C
Community

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

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

我已经在 SO 中的 this 答案中详细说明了配置步骤。


P
Pang

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

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

R
Ravi Siva Prasad M

我遇到了类似的问题,发现我的 npm 配置文件(.npmrc)有错误的注册表项。将其注释掉并重新运行 npm install。有效。


m
monnef

操作系统:Windows 7

对我有用的步骤:

npm config get proxy npm config get https-proxy 评论:我执行这个命令是为了知道我的代理设置 npm config rm proxy npm config rm https-proxy npm config set registry=http://registry.npmjs.org/ npm install


M
Maciek Leks

因为我在工作中设置代理设置并在家里关闭它们时仍然存在问题,所以我编写了脚本并发布了 npm-corpo-proxy.sh。在每个 corpo 中,密码必须经常更改,并且必须包含特殊字符,这些字符必须在输入 npm config 之前进行编码(对于 backash 表单域\用户也是如此)。


V
Vijay Mishra

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

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

那么你的 C:\Users.npmrc 应该像

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

servername :可以从您的 Internet Explorer 的 pac 文件中获取。