Python-gitlab API SSL握手失败:错误([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')])。

8

我想列出 Github 仓库中所有的问题。

Python3 代码:

import gitlab
gl = gitlab.Gitlab('https://git.myinternalsite.com/project', private_token='XXXXXXXXXXXXXXX', api_version=4) 

issues = gl.issues.list()

这将会产生以下错误:

SSLError: HTTPSConnectionPool(host='git.zonetrading.com', port=443): Max retries exceeded with url: /cloudquant/user-issues/api/v4/issues (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",),))

有什么解决该错误的想法吗?


你是否在使用自签名证书? - secustor
是因为 https://twitter.com/bradfitz/status/950932394407702528 的原因吗? - VonC
不使用自签名证书。唯一未显示的是私有令牌是在我们内部的GitLab安装中创建的(提供了XXXXX)。我尝试使用UID和PWD,但出现了相同的SSLError。 - TayloeD
2个回答

6
问题似乎出在配置有问题的网站服务器上。
TLS证书仅针对域名为www.parkingcrew.com而不是git.zonetrading.com进行认证,这会导致certificate verify failed错误。
要解决此问题,您需要请求包含目标域的新证书,在本例中为git.zonetrading.com
如果要确认这是唯一的错误,可以在客户端中使用ssl_verify参数关闭证书验证。
gl = gitlab.Gitlab('https://git.myinternalsite.com/project', private_token='XXXXXXXXXXXXXXX', api_version=4, ssl_verify=False) 

我不知道你可以在这里传递那个参数。 - Alper

-1

感谢大家的反馈。

这是我最终解决问题的方法:

额外的信息...我们企业的Github没有合适的证书,因此会生成警告。

##########################################
# Dump one ticket to screen so you can see
# all the fields available.
##########################################
import pycurl
from io import BytesIO

buffer = BytesIO()

c = pycurl.Curl()

#
# using a private token from git. Had to register my token
# as a function within the github user profile settings
#
private_token = 'private_token=XXXXXMyPrivateTokenXXXXX'

#
# projects/3 - I had to dump the project list to find the id number 
# of the project that I wanted to get all the issues for
#
GitAPIurl = 'https://git.****MyDomain***.com/api/v4/projects/3/issues?{}'.format(private_token)

c.setopt(c.URL,GitAPIurl)
# turn off SSL verification because we don't have a proper SSL Certification
c.setopt(pycurl.SSL_VERIFYPEER, 0)
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()

body = []

body = buffer
# Body is a byte string.
# We have to know the encoding in order to print it to a text file
# such as standard output.

foo = {}
dictionary = json.loads(buffer.getvalue())
foo = dictionary[0]

print(foo)

1
你的解决方案需要42行代码。如果你使用gitlab Python模块,你可能只需要1行代码就能解决问题:import gitlab; print gitlab.Gitlab*projects*issue*。或者你甚至可以直接使用gitlab命令行工具(也是由Python-gitlab pip安装提供的)。Python-gitlab会处理HTTP API,使得编写更少的代码变得十分容易,让你的工作效率提高10倍。 - Trevor Boyd Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接