“ bq”命令行工具抛出CERTIFICATE_VERIFY_FAILED

时间:2018-10-17 07:48:00

标签: ssl google-bigquery ssl-certificate gcloud google-cloud-sdk

更新(2019-02-07):issue已修复,因此,如果仍然遇到此问题,请尝试gcloud components update


在过去的几个月中的某个时候,我的bq工具停止工作。甚至一个简单的事情也会显示此错误:

$ bq show
BigQuery error in show operation: Cannot contact server. Please try again.
Traceback: Traceback (most recent call last):
File "/opt/google-cloud-sdk/platform/bq/bigquery_client.py", line 685, in BuildApiClient
response_metadata, discovery_document = http.request(discovery_url)
File "/opt/google-cloud-sdk/platform/bq/third_party/oauth2client_4_0/transport.py", line 176, in new_request
redirections, connection_type)
File "/opt/google-cloud-sdk/platform/bq/third_party/oauth2client_4_0/transport.py", line 283, in request
connection_type=connection_type)
File "/opt/google-cloud-sdk/platform/bq/third_party/httplib2/__init__.py", line 1626, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/opt/google-cloud-sdk/platform/bq/third_party/httplib2/__init__.py", line 1368, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/opt/google-cloud-sdk/platform/bq/third_party/httplib2/__init__.py", line 1288, in _conn_request
conn.connect()
File "/opt/google-cloud-sdk/platform/bq/third_party/httplib2/__init__.py", line 1082, in connect
raise SSLHandshakeError(e)
SSLHandshakeError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)

我尝试了以下操作:

  • sudo gcloud components update(版本221.0.0)。
  • sudo pacman -Syu(系统更新)以获取最新的SSL证书集。这是Arch Linux,几乎总是在不断发展。
  • sudo gcloud components reinstall
  • 卸载google-cloud-sdk,清除剩余的/opt/google-cloud-sdk,然后完全从AUR重新安装。
  • 添加--httplib2_debuglevel=3(未记录有效值,找到值3 here)。这不会产生任何额外的输出。
  • 添加--ca_certificates_file=/etc/ca-certificates/extracted/tls-ca-bundle.pem--ca_certificates_file=/etc/ca-certificates/extracted/ca-bundle.trust.crt--ca_certificates_file=/etc/ssl/certs/ca-certificates.crt中的一个肯定是我系统上的一组根证书。其中的最后一个供curl使用,可以与www.googleapis.com通话。
  • 拨入源代码以发现/opt/google-cloud-sdk/platform/bq/third_party/httplib2/cacerts.txt是默认使用的证书捆绑包。如果我使用curl --cacert ...尝试此操作,它仍然可以正常工作。
  • 在此shell中设置GOOGLE_APPLICATION_CREDENTIALS环境变量。不出所料,这也没有什么不同。 bq甚至没有机会开始OAuth握手之前就发生SSL错误。
  • 添加--disable_ssl_validation。这“有效”,但显然不安全。

还有其他人看到这个,或者有想法如何调试/解决吗?

2 个答案:

答案 0 :(得分:1)

在使用Arch Linux时,我也看到了完全相同的问题。

但是,当您在命令行上发出bq命令时,我非常确定{strong>不使用/opt/google-cloud-sdk/platform/bq/third_party/httplib2/cacerts.txt处的证书文件,因为标志{{ 1}}将在应用程序引导过程中自动放入标志中。在Arch Linux上,此文件是指向--ca_certificates_file=/etc/ssl/certs/ca-certificates.crt的符号链接。

我尝试将/etc/ca-certificates/extracted/tls-ca-bundle.pemcurl与该CA捆绑包一起用于被调用的API URL,即

openssl s_client

它工作正常。

我的假设是,这不是证书丢失或过期的问题。我的https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest 软件包的版本为pyopenssl,所以这里是最新版本。但是,我认为此问题是由TLS握手过程中不受支持的密码或算法引起的。

答案 1 :(得分:0)

有一个public issue tracker,您的行为与此类似。我建议starring it保持更新并提供您的情况。

如果您在公司代理后面,则在评论#8上有一种情况是公司代理替换证书,并且在评论#16上提供了解决方法

希望有帮助。