当我尝试使用npm安装包时,它不起作用.经过漫长的等待,我最终得到一个错误'无法建立隧道套接字,sutatusCode = 403'.
$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
npm ERR! at ClientRequest.onConnect (c:\Program Files\nodejs\node_modules\npm\node_modules\request\tunnel.js:148:19)
npm ERR! at ClientRequest.g (events.js:193:14)
npm ERR! at ClientRequest.EventEmitter.emit (events.js:123:20)
npm ERR! at Socket.socketOnData (http.js:1393:11)
npm ERR! at TCP.onread (net.js:403:27)
Run Code Online (Sandbox Code Playgroud)
但是,当我在我的网络浏览器(谷歌浏览器)中浏览相同的URL时,它会正常加载(请参阅脚注).https://registry.npmjs.org/coffee-script
出了什么问题?
虽然我碰巧使用https代理,但我确信这不是问题所在.我已经配置了环境变量https_proxy(根据npm 用户指南).我知道环境变量是正确的,因为Python包管理器pip正确地遵循它.
我认为问题与SSL证书有关,因为如果我下载该URL wget,我会得到关于证书的明确错误
$ wget https://registry.npmjs.org/coffee-script
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = c:/progra~1/wget/etc/wgetrc
--2012-12-17 12:14:07-- https://registry.npmjs.org/coffee-script
Resolving corpproxy... 10.254.215.35
Connecting to corpproxy|10.254.215.35|:8080... connected.
ERROR: cannot verify registry.npmjs.org's certificate, issued by `/C=US/ST=CA/L=Oakland/O=npm/OU=npm Certificate Authority/CN=npmCA/emailAddress=i@izs.me':
Unable to locally verify the issuer's authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?不损害安全性.
我曾经在我的网络浏览器中获得SSL证书错误,直到我在控制面板的Internet选项中将'npmCA'证书安装为'受信任的根证书颁发机构'(屏幕截图)
)
编辑:我尝试了一个不安全的解决方法每https://npmjs.org/doc/config.html#strict-ssl
npm set strict-ssl false
Run Code Online (Sandbox Code Playgroud)
但它仍然会出现同样的错误
$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
Run Code Online (Sandbox Code Playgroud)
Ale*_*lor 124
TL; DR - 只需运行此命令,不要禁用您的安全性:
#For Windows/MacOS/Linux
npm config set cafile "<path to your certificate file>"
#Check the 'cafile'
npm config get cafile
Run Code Online (Sandbox Code Playgroud)
我不得不在Windows下的公司防火墙后面使用npm,pip,maven等 - 这并不好玩.我会尽可能地保持这个平台不可知/意识到.
HTTP_PROXY&HTTPS_PROXY是许多软件使用的环境变量,用于了解代理的位置.在Windows下,许多软件也使用您的操作系统指定代理,这是完全不同的事情.这意味着你可以让Chrome(它使用你的Internet选项中指定的代理)连接到URL就好了,但是npm,pip,maven等没有用,因为他们使用HTTPS_PROXY(除非他们使用HTTP_PROXY - 见后面).通常,环境变量看起来像:
http://proxy.example.com:3128
Run Code Online (Sandbox Code Playgroud)
但是你得到的403表明你没有针对你的代理进行身份验证.如果它是代理上的基本身份验证,您将要将环境变量设置为以下形式:
http://user:pass@proxy.example.com:3128
Run Code Online (Sandbox Code Playgroud)
有一个HTTP状态代码407(需要代理身份验证),这是更正确的方式来说它是代理而不是拒绝您的请求的目标服务器.这段代码困扰我的时间最长,直到在Google上花了很多时间后,我才知道我的代理使用了NTLM身份验证.HTTP基本身份验证不足以满足我的公司领导者安装的任何代理.我在我的本地机器上使用Cntlm(未经验证),然后让它使用上游代理处理NTLM身份验证.然后,我不得不告诉所有不能做NTLM使用我的本地计算机作为代理程序-通常是如设置简单HTTP_PROXY和HTTPS_PROXY.否则,对于npm使用(如@Agus建议的那样):
npm config set proxy http://proxy.example.com:3128
npm config set https-proxy http://proxy.example.com:3128
Run Code Online (Sandbox Code Playgroud)
在此设置(笨拙地)嗡嗡作响大约一年后,公司领主决定改变代理.不仅如此,它还不再使用NTLM了!一个勇敢的新世界可以肯定.但是因为那些恶意软件的编写者现在通过HTTPS提供恶意软件,他们保护我们可怜的无辜用户的唯一方法是在他们甚至到达我们之前扫描威胁的每个连接都是中间人.你可以想象,我被安全感所克服.
简而言之,需要将自签名证书安装到npm中以避免SELF_SIGNED_CERT_IN_CHAIN:
npm config set cafile "<path to certificate file>"
Run Code Online (Sandbox Code Playgroud)
我认为这就是让我知道如何让npm在代理/防火墙后面工作.愿有人发现它有用.
编辑:通过使用HTTP注册表或设置来关闭此问题的HTTPS是一个非常常见的建议NODE_EXTRA_CA_CERTS.这些都不是好主意,因为你正在进行进一步的中间人或重定向攻击.在执行软件包安装的机器上快速欺骗您的DNS记录,您会发现自己信任任何地方的软件包.使HTTPS工作看起来似乎很多,但强烈建议.如果您是负责允许不受信任的代码进入公司的人,您就会明白为什么.
Ehs*_*san 40
使用http版本的存储库修复了这个问题:
npm config set registry http://registry.npmjs.org/
Run Code Online (Sandbox Code Playgroud)
我有同样的问题,我克服了使用
npm config set proxy http://my-proxy.com:1080
npm config set https-proxy http://my-proxy.com:1080
Run Code Online (Sandbox Code Playgroud)
另外有关node-doc的信息
小智 6
几天前我碰巧遇到了类似的SSL问题.问题是你的npm没有为https://registry.npmjs.org使用的证书设置根证书.
解决方案:
wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt解决问题的wgetnpm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crt设置根证书为您的NPM程序.您可以从以下位置下载根证书: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt
注意:不同的程序可能使用不同的管理根证书的方式,因此不要将浏览器与其他人混合使用.
让我们wget https://registry.npmjs.org/coffee-script先解决你的问题.你的片段说:
ERROR: cannot verify registry.npmjs.org's certificate,
issued by /C=US/ST=CA/L=Oakland/O=npm/OU=npm
Certificate Authority/CN=npmCA/emailAddress=i@izs.me:
Unable to locally verify the issuer's authority.
这意味着您的wget程序无法验证https://registry.npmjs.org证书.导致此问题的原因有两个:
所以解决方案是明确设置根证书https://registry.npmjs.org.我们可以使用openssl来确保下面的原因是问题所在.
尝试:openssl s_client -host registry.npmjs.org -port 443在命令行上,我们将收到此消息(前几行):
CONNECTED(00000003)
depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=San Francisco/O=Fastly, Inc./CN=a.sni.fastly.net
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
---
此行 verify error:num=20:unable to get local issuer certificate确保https://registry.npmjs.org不包装根证书.所以我们谷歌DigiCert High Assurance EV Root CA根证书.
小智 5
npm config set strict-ssl false
Run Code Online (Sandbox Code Playgroud)
为我解决了这个问题。在这种情况下,我的代理和工件存储库都位于AWS云上的私有子网后面
| 归档时间: |
|
| 查看次数: |
172284 次 |
| 最近记录: |