使用Python连接JIRA API时SSL3证书验证失败
我现在在用Python2.7和JIRA的REST API连接JIRA时遇到了一个错误(你可以在这里查看相关文档:http://jira-python.readthedocs.org/en/latest/)。
当我执行以下代码时:
from jira.client import JIRA
options = {
'server': 'https://jira.companyname.com'
}
jira = JIRA(options)
控制台上出现了以下错误信息:
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
我是不是漏掉了什么,或者做错了什么呢?
谢谢!
4 个回答
只需要安装 python-certifi-win32 这个模块,这样就可以轻松解决这些错误,不用再烦恼了。
在Windows系统上,请按照以下步骤操作:
- 使用谷歌浏览器打开网站,然后点击锁形图标。
- 接着点击证书,会弹出一个新窗口。
- 然后点击认证路径,从列表中选择第一个选项,这个选项是根证书,然后选择查看证书,又会弹出一个窗口。
- 进入详细信息标签,点击复制到文件。然后点击下一步,选择Base-64编码的x509.(CER)这个选项,点击下一步并将.cer文件保存在本地。
一旦获得了.cer文件,将其添加到Python脚本中,如下所示:
jira_options = {
'server': jira_server_name,
'verify': 'path_to_directory_containing_certificate_file/certificate.cer'
}
这样应该就不会出现任何安全警告了。
我遇到了类似的SSL证书验证错误,查看了一下“JIRA”的方法定义,发现可以关闭这个验证。
:param options: Specify the server and properties this client will use. Use a dict with any
of the following properties:
* server -- the server address and context path to use. Defaults to ``http://localhost:2990/jira``.
* rest_path -- the root REST path to use. Defaults to ``api``, where the JIRA REST resources live.
* rest_api_version -- the version of the REST resources under rest_path to use. Defaults to ``2``.
* verify -- Verify SSL certs. Defaults to ``True``.
* resilient -- If it should just retry recoverable errors. Defaults to `False`.
试试这个:
from jira.client import JIRA
options = {'server': 'https://jira.companyname.com','verify':False}
jira = JIRA(options)
我知道我来得有点晚,但希望这能帮助到将来的人。
为什么不应该关闭验证
虽然关闭证书验证是最简单的“解决方案”,但这并不是一个明智的选择。这样做实际上是在说:“我不在乎我是否信任你,反正我会把我的所有信息都发给你。”这会让你面临中间人攻击的风险。
如果你正在连接公司的Jira服务器,并且它有TLS/SSL证书,你应该对这个证书进行验证。我建议你问问IT部门这个证书在哪里。它可能在你公司的某个根证书中。
如果你在Chrome浏览器中连接到服务器,地址栏左侧应该会显示一个锁的图标,表示它是通过TLS/SSL安全连接的。
你可以在Chrome中右键点击那个锁 -> 详情 -> 查看证书
。
那么,我该怎么做呢?
直接向verify
选项提供必要的证书。
jira-python
使用Requests
来处理HTTP相关的内容 (查看文档)。根据Requests文档,你可以在verify
中指定证书文件的路径。
因此,你可以像这样在verify
中提供你公司的根证书:
jira_options = {
'server': jira_server_name,
'verify': 'path/to/company/root/certificate',
}
如果你使用的是Windows机器(这应该是个安全的假设?),那么这个根证书存储在注册表中,获取它的最佳方式是使用wincertstore
。