无法安装google cloud sdk:“<gcloud.components.update>无法获取组件”Windows7

时间:2015-05-25 14:52:48

标签: windows-7 sdk google-cloud-storage

当我尝试安装google cloud sdk时,会发生以下错误:

错误:(gcloud.components.update)无法从服务器获取组件列表。检查您的网络设置,然后重试。 Google Cloud SDK安装程序现在将退出。 按任意键继续 。 。

result = func(*args)   File "C:\python27_x64\lib\urllib2.py", line 1222, in https_open
return self.do_open(httplib.HTTPSConnection, req)   File "C:\python27_x64\lib\urllib2.py", line 1184, in do_open
raise URLError(err) urllib2.URLError: <urlopen error [Errno 10061] No connection could be made because the target machine actively refused it>

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我在安装和另一个以前正在运行的安装上的某些命令上遇到了类似的错误。在浏览并添加一些日志之后,看起来SSL Cert Verification对于来自Google服务器的组件列表请求失败了:

$ gcloud preview managed-instance-groups ...
You do not currently have this command group installed.  Using it requires the installation of components: [preview]
Could not fetch [https://dl.google.com/dl/cloudsdk/release/components-2.json]
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>
ERROR: (gcloud) Failed to fetch component listing from server. Check your network settings and try again.

要解决它(以几乎肯定不可取的方式),我禁用了该单个请求的SSL证书验证。如果您想沿着这条路走下去,请修改

中的MakeRequest()
./google-cloud-sdk/lib/googlecloudsdk/core/updater/installers.py:248

从:

return urllib2.urlopen(req, timeout=TIMEOUT_IN_SEC)

为:

return urllib2.urlopen(req, timeout=TIMEOUT_IN_SEC, context=ssl.SSLContext(ssl.PROTOCOL_TLSv1))

https://code.google.com/p/google-cloud-sdk/issues/detail?id=143已经开启了这个问题。)

更新时间:2015年5月26日

在我的情况下,结果是我安装的OpenSSL版本与Python引用的OpenSSL版本不匹配(这可能在更新到OpenSSL@1.0.2a-1后开始发生。)

要解决此问题,我将我的OpenSSL版本更新为最新版本:

brew update
brew upgrade openssl

然后我重新安装了Python引用这个更新版本的OpenSSL:

brew uninstall python
brew install python --with-brewed-openssl

在此之后,我通过谷歌云SDK安装(因为我在那里找到了一些解决方案;你可能不必这样做)并从头开始安装:

curl https://sdk.cloud.google.com | bash

我们是金色的!

有关OS X的这些OpenSSL问题的进一步阅读,请查看以下文章:https://hynek.me/articles/apple-openssl-verification-surprises/

答案 1 :(得分:0)

<强> TL; DR

  1. 找到Google脚本使用的cacerts.txt文件。应该在<google-cloud-sdk>/lib/third_party/httplib2/cacerts.txt
  2. 在Firefox中打开https://dl.google.com并导出其证书。
  3. 将证书的内容复制到cacerts.txt文件的末尾。
  4. 您可能还需要make sure your system's openssl version is the same version as the openssl that's used by python, as of jemartti's answer。我试过了,但还不够。我不知道这是否必不可少。

    达成此解决方案的步骤

    尝试jemartti's answer无效后,我使用--verbosity debug标志来追踪失败点。 输出是:

      

    DEBUG:无法获取   [https://dl.google.com/dl/cloudsdk/channels/rapid/components-v100.0.0.json]   Traceback(最近一次调用最后一次):文件   &#34; /usr/local/google-cloud-sdk/lib/googlecloudsdk/core/updater/snapshots.py" ;,   第186行,在_DictFromURL中       response = installers.ComponentInstaller.MakeRequest(url,command_path)文件   &#34; /usr/local/google-cloud-sdk/lib/googlecloudsdk/core/updater/installers.py" ;,   第277行,在MakeRequest中       return urlopen_with_cacerts.urlopen(req,timeout = TIMEOUT_IN_SEC)文件   &#34; /usr/local/google-cloud-sdk/lib/googlecloudsdk/core/util/urlopen_with_cacerts.py" ;,   第40行,在urlopen       return orig_urlopen(* args,** kwargs)File&#34; /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py" ,   第154行,在urlopen中       return opener.open(url,data,timeout)File&#34; /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py" ;,   第431行,公开       response = self._open(req,data)File&#34; /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py" ,   第449行,在_open       &#39; _open&#39;,req)文件&#34; /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py" ;,   第409行,在_call_chain中       result = func(* args)File&#34; /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py",   第1240行,在https_open中       context = self._context)File&#34; /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py",   第1197行,在do_open中       提出URLError(错误)URLError:

    所以我打开了/usr/local/google-cloud-sdk/core/util/urlopen_with_cacerts.py,看到它调用了httplib2 urlopen方法,其cafile参数来自httplib2.CA_CERTS。我添加了一行打印httplib2.CA_CERTS,其输出为:

      

    /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

    然后,as described in this answer,这就是我做的原因:

    1. 在Firefox中打开网址并导出证书。
    2. 将证书的内容复制到cacerts.txt文件的末尾。
    3. 作为Mac用户,我还使用了the one-liner described here(出于某种原因产生了与Firefox的证书导出功能不同的证书),以便将证书保存在我的计算机上(根据需要替换exmple.comexample.crt

      openssl x509 -in <(openssl s_client -connect example.com:443 -prexit 2>/dev/null) -out ~/example.crt