Requests: 安装证书,设置 REQUESTS_CA_BUNDLE 环境变量,仍然出现 SSL 错误。

创建于 2013-07-25  ·  10评论  ·  资料来源: psf/requests

我正在使用 jenkinsapi 模块,它在后台使用请求。 如果我尝试开箱即用,将它指向使用 SSL 的 jenkins 服务器,我会得到:

SSLError: [Errno 1] _ssl.c:504: error:14090086 :SSL例程:SSL3_GET_SERVER_CERTIFICATE : 证书验证失败

jenkinsapi 不提供设置 verify=False 的钩子。 我尝试从 jenkins 服务器保存证书并将 REQUESTS_CA_BUNDLE 环境变量设置为指向它,但仍然出现相同的错误。 我也尝试安装 certifi,但没有任何区别。

我知道我可以破解 jenkinsapi 代码,但这并不令人满意,因为我的代码的所有用户都必须做同样的事情。 我是否忽略了什么?

最有用的评论

我遇到了同样的问题并且 ssl certifacate verify failed 问题,通过查看 boto3 代码,我发现 REQUESTS_CA_BUNDLE 没有设置,所以我通过手动设置解决了这两个问题:

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

对于 aws-cli,我想在 ~/.bashrc 中设置 REQUESTS_CA_BUNDLE 将解决这个问题(未测试,因为我的 aws-cli 没有它就可以工作)

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE

所有10条评论

你能告诉我保存的证书是什么样的吗? 应该可以简单地将其粘贴在这里。

感谢您的回复。 我重新保存了证书,现在一切正常。

该死! 我说得太快了。 这是证书:

-----开始认证-----
MIIGQDCCBSigAwIBAgIKWQnHpQAAAAAIzjANBgkqhkiG9w0BAQUFADBZMRMwEQYK
CZImiZPyLGQBGRYDY29tMRQwEgYKCZImiZPyLGQBGRYEZWJheTEUMBIGCgmSJomT
8ixkARkWBGNvcnAxFjAUBgNVBAMTDUFNRVItU1NMQ0EtMDIwHhcNMTIxMTE4MDUz
MTA4WhcNMTQxMTE4MDUzMTA4WjB1MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2Fs
aWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2UxFDASBgNVBAoTC1BheVBhbCBJbmMu
MQwwCgYDVQQLEwNDRUkxGjAYBgNVBAMTEWZ1c2lvbi5wYXlwYWwuY29tMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwOZj4ezQ/k5vTU6E63uNsP+LZjeg
4kTEUwSzFsRj3NImQdfOrQ7W7S386ep2EZZqmjevO6HBzkaXaYYQ0GSqthdspd53
A8GnLi0q43oFy+kyAc2ItAM0SH/GOt0J+5EUdS12S821WMiwebHInSHINAjexAHN
Sm87yXCyO8mZ3Jzc3+PFraveF9WFmE0NLZUDpEMxq17K3/6iGLsVO/YZkUpaAXNJ
962fGrIZ4xcvK//S903ehloKwQnRCgtNoGCmvsoDftbYye6LfRh/rH3xWFXIUmWG
Wib27ZwAgbyxz2FPcexie4FB/IzbH2l9Tp5rzGWfs1159VmVhQ/L3EJIDQIDAQAB
o4IC7DCCAugwHQYDVR0OBBYEFMkZJD5QaahE21k37UvPIP1VmZ1SMB8GA1UdIwQY
MBaAFLI24M3s4ViBTJbTf1lWAEsUzehVMIIBDQYDVR0fBIIBBDCCAQAwgf2ggfqg
gfeGgb9sZGFwOi8vL0NOPUFNRVItU1NMQ0EtMDISQ049QU1FUi1TU0xDQS0wMixD
Tj1DRFAsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049
Q29uZmlndXJhdGlvbixEQz1jb3JwLERDPWViYXksREM9Y29tP2NlcnRpZmljYXRl
UmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Q
b2ludIYzaHR0cDovL3BraS5jb3JwLmViYXkuY29tL0NlcnREYXRhL0FNRVItU1NM
Q0EtMDIuY3JsMIIBTgYIKwYBBQUHAQEEggFAMIIBPDCBsQYIKwYBBQUHMAGGgars
ZGFwOi8vL0NOPUFNRVItU1NMQ0EtMDISQ049QUlBLENOPVB1YmxpYyUyMEtleSUy
MFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9Y29ycCxE
Qz1lYmF5LERDPWNvbT9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2Vy
dGlmaWNhdGlvbkF1dGhvcml0eTBbBggrBgEFBQcwAoZPaHR0cDovL3BraS5jb3Jw
LmViYXkuY29tL0NlcnREYXRhL0FNRVItU1NMQ0EtMDIuY29ycC5lYmF5LmNvbV9B
TUVSLVNTTENBLTAyLmNydDApBggrBgEFBQcwAYYdaHR0cDovL3BraS5jb3JwLmVi
YXkuY29tL29jc3AwIQYJKwYBBAGCNxQCBBQeEgBXAGUAYgBTAGUAcgB2AGUAcjAL
BgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQAD
ggEBAFj5s9SdtRpXLz03BjPFsDvQPzoyML9ngHL5zyYMlotUpD7d+aO41Q2E2+LO
REFbd3NAnLT3MfWMHAxNaZ4TRUog1fFJmLJxHTBax5fpmY8YAhiPjQIO+IZOUZO3
4lAwXKsq4ylWS2tlbxL56mPngN2EzLisWgIZqJSx9zd1K/LvKyvs/R3wxBerhTN5
LyHFf9/ByUhaqgIE8jydM4qiS8o3zxjrPAIbi6lnZjktkguYTSAKDoHb17BkNoPr
mU1xDtD1/FuX22dfHpqmJSYVubPVfUTvGB3julT2GNNREoHsQI7wmgFBEMaTdvJq
42DUnHIK0pdMzb2urxL/toZ3mHY=
-----结束证书-----

回溯(最近一次调用最后一次):
文件“goals.py”,第 3 行,在
J = api.Jenkins('https://fusion.[REDACTED].com/jenkins/')
文件“C:\python27\lib\site-packages\jenkinsapi\jenkins.py”,第 35 行,在init 中
詹金斯基地。 初始化(自我,baseurl)
文件“C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py”,第 27 行,在init 中
self.poll()
文件“C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py”,第 49 行,在 poll
self._data = self._poll()
_poll 中的文件“C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py”,第 53 行
返回 self.get_data(url)
文件“C:\python27\lib\site-packages\jenkinsapi\jenkinsbase.py”,第 57 行,在 get_data 中
响应 = requester.get_url(url)
文件“C:\python27\lib\site-packages\jenkinsapi\utils\requester.py”,第 59 行,在 get_url 中
返回 requests.get(url, _requestKwargs)文件“C:\python27\lib\site-packages\requests\api.py”,第 55 行,在 get返回请求('get', url, *_kwargs)文件“C:\python27\lib\site-packages\requests\api.py”,第 44 行,请求中返回 session.request(method=method, url=url, *_kwargs)文件“C:\python27\lib\site-packages\requests\sessions.py”,第 335 行,请求中resp = self.send(prep, *_send_kwargs)文件“C:\python27\lib\site-packages\requests\sessions.py”,第 438 行,发送r =adapter.send(request, * kwargs)
文件“C:\python27\lib\site-packages\requests\adapters.py”,第 331 行,发送
引发 SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086 :SSL例程:SSL3_GET_SERVER_CERTIFICATE :certificate verify failed

您能否尝试直接使用请求进行连接,而不通过 jenkinsapi,而是将您安全的证书传递给请求。

r=requests.get(url,verify=certfile)

SSLError: [Errno 1] _ssl.c:504: error:14090086 :SSL例程:SSL3_GET_SERVER_CERTIFICATE : 证书验证失败

r=requests.get(url,cert=certfile)

SSLError: [Errno 336265225] _ssl.c:351:错误:140B0009 :SSL例程: SSL_CTX_use_PrivateKey_file :PEM 库

这是否意味着我应该拥有私钥? 我怀疑服务器所有者会让我拥有它。

抱歉,忽略第二部分 - 我发现指定“cert”是关于向服务器验证自己的身份,这不是这里的问题。

现在我们知道问题出在证书上:-)
鉴于证书来自 CA 而不是服务器本身:推力链是否完整?
您应该在导出证书的浏览器中看到此链。
验证证书请求需要一个完整的链。 最后一个元素由服务器发送,我假设您只将根证书保存到文件中。
您仍然需要根和叶之间的所有证书。 这些可以由服务器与叶证书一起发送,或者您应该能够将它们添加到证书文件中。

谢谢 - 我终于让它工作了! 总而言之,如果这对其他人有帮助:我需要将链中的每个证书从服务器本身导出到根目录,以 base64 格式保存每个证书,然后将所有证书复制到一个文件中,并设置环境变量 REQUESTS_CA_BUNDLE 指向它。

再次感谢你的帮助!

对于其他 Google 员工 - 您可以使用以下命令在 jenkinsapi 中禁用 SSL 验证:

from jenkinsapi.jenkins import Jenkins
from jenkinsapi.utils.requester import Requester

j = Jenkins(base_url, requester=Requester(username, password, baseurl=base_url, ssl_verify=False))

我遇到了同样的问题并且 ssl certifacate verify failed 问题,通过查看 boto3 代码,我发现 REQUESTS_CA_BUNDLE 没有设置,所以我通过手动设置解决了这两个问题:

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

对于 aws-cli,我想在 ~/.bashrc 中设置 REQUESTS_CA_BUNDLE 将解决这个问题(未测试,因为我的 aws-cli 没有它就可以工作)

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

cnicodeme picture cnicodeme  ·  3评论

brainwane picture brainwane  ·  3评论

mitar picture mitar  ·  4评论

jake491 picture jake491  ·  3评论

avinassh picture avinassh  ·  4评论