Requests: Certifi instalado, definir REQUESTS_CA_BUNDLE env var, ainda obtendo erro de SSL.

Criado em 25 jul. 2013  ·  10Comentários  ·  Fonte: psf/requests

Estou usando o módulo jenkinsapi, que usa solicitações nos bastidores. Se tento usá-lo imediatamente, apontando-o para um servidor jenkins que usa SSL, obtenho:

SSLError: [Errno 1] _ssl.c: 504: erro: 14090086 : Rotinas SSL

jenkinsapi não fornece um gancho para definir verify = False. Tentei salvar o certificado do servidor jenkins e definir a variável de ambiente REQUESTS_CA_BUNDLE para apontar para ele e ainda obtive o mesmo erro. Também tentei instalar o certifi mas não faz diferença.

Eu sei que poderia hackear o código jenkinsapi, mas isso não é satisfatório porque todos os usuários do meu código teriam que fazer a mesma coisa. Estou esquecendo algo?

Comentários muito úteis

Encontrei o mesmo problema e falha na verificação do certificado SSL, ao revisar o código boto3, descobri que REQUESTS_CA_BUNDLE não está definido, então resolvi os dois problemas configurando-o manualmente:

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')

Para o aws-cli, acho que definir REQUESTS_CA_BUNDLE em ~ / .bashrc corrigirá esse problema (não testado porque meu aws-cli funciona sem ele)

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

Todos 10 comentários

Você pode me mostrar como era o certificado salvo, por favor? Deve ser possível simplesmente colá-lo aqui.

Obrigado por responder. Salvei o certificado novamente e as coisas estão funcionando agora.

Droga! Eu falei cedo demais. Aqui está o cert:

----- BEGIN CERTIFICATE -----
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
Q0EtMDIuY3JsMIIBTgYIKwYBBQUHAQEEggFAMIIBPDCBsQYIKwYBBQUHMAKGgaRs
ZGFwOi8vL0NOPUFNRVItU1NMQ0EtMDIsQ049QUlBLENOPVB1YmxpYyUyMEtleSUy
MFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9Y29ycCxE
Qz1lYmF5LERDPWNvbT9jQUNlcnRpZmljYXRlP2Jhc2U / b2JqZWN0Q2xhc3M9Y2Vy
dGlmaWNhdGlvbkF1dGhvcml0eTBbBggrBgEFBQcwAoZPaHR0cDovL3BraS5jb3Jw
LmViYXkuY29tL0NlcnREYXRhL0FNRVItU1NMQ0EtMDIuY29ycC5lYmF5LmNvbV9B
TUVSLVNTTENBLTAyLmNydDApBggrBgEFBQcwAYYdaHR0cDovL3BraS5jb3JwLmVi
YXkuY29tL29jc3AwIQYJKwYBBAGCNxQCBBQeEgBXAGUAYgBTAGUAcgB2AGUAcjAL
BgNVHQ8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQAD
ggEBAFj5s9SdtRpXLz03BjPFsDvQPzoyML9ngHL5zyYMlotUpD7d + aO41Q2E2 + LO
REfbd3NAnLT3MfWMHAxNaZ4TRUog1fFJmLJxHTBax5fpmY8YAhiPjQIO + IZOUZO3
4lAwXKsq4ylWS2tlbxL56mPngN2EzLisWgIZqJSx9zd1K / LvKyvs / R3wxBerhTN5
LyHFf9 / ByUhaqgIE8jydM4qiS8o3zxjrPAIbi6lnZjktkguYTSAKDoHb17BkNoPr
mU1xDtD1 / FuX22dfHpqmJSYVubPVfUTvGB3julT2GNNREoHsQI7wmgFBEMaTdvJq
42DUnHIK0pdMzb2urxL / toZ3mHY =
----- CERTIFICADO FINAL -----

Traceback (última chamada mais recente):
Arquivo "goals.py", linha 3, em
J = api.Jenkins ('https: // fusion. [REMODELADO] .com / jenkins /')
Arquivo "C: \ python27 \ lib \ site-packages \ jenkinsapi \ jenkins.py", linha 35, no init
JenkinsBase. init (self, baseurl)
Arquivo "C: \ python27 \ lib \ site-packages \ jenkinsapi \ jenkinsbase.py", linha 27, no init
self.poll ()
Arquivo "C: \ python27 \ lib \ site-packages \ jenkinsapi \ jenkinsbase.py", linha 49, na enquete
self._data = self._poll ()
Arquivo "C: \ python27 \ lib \ site-packages \ jenkinsapi \ jenkinsbase.py", linha 53, em _poll
return self.get_data (url)
Arquivo "C: \ python27 \ lib \ site-packages \ jenkinsapi \ jenkinsbase.py", linha 57, em get_data
resposta = requester.get_url (url)
Arquivo "C: \ python27 \ lib \ site-packages \ jenkinsapi \ utils \ requester.py", linha 59, em get_url
return request.get (url,








Arquivo "C: \ python27 \ lib \ site-packages \ requests \ adapters.py", linha 331, em envio
aumentar SSLError (e)
request.exceptions.SSLError: [Errno 1] _ssl.c: 504: erro: 14090086 : Rotinas SSL

Você poderia tentar se conectar usando solicitações diretamente, sem passar pelo jenkinsapi, mas ao passar o certificado, você protege as solicitações.

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

SSLError: [Errno 1] _ssl.c: 504: erro: 14090086 : Rotinas SSL

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

SSLError: [Errno 336265225] _ssl.c: 351: erro: 140B0009 : Rotinas SSL

Isso significa que devo ter a chave privada? Duvido que os proprietários do servidor me deixem tê-lo.

Desculpe, ignore a segunda parte - descobri que especificar "cert" é sobre como se autenticar no servidor, o que não é o problema aqui.

Agora sabemos que o problema está no cert :-)
Dado que o certificado é da CA e não do próprio servidor: a cadeia de impulso está completa?
Você deve ver esta cadeia em seu navegador para onde exportou o certificado.
Para verificar um pedido de certificado é necessária uma cadeia completa. O último elemento é enviado pelo servidor, presumo que você salvou apenas o certificado raiz em um arquivo.
Você ainda precisa de todos os certificados entre a raiz e a folha. Eles podem ser enviados pelo servidor junto com o certificado folha ou você deve ser capaz de adicioná-los ao arquivo de certificado.

Obrigado - finalmente consegui fazer funcionar! Para resumir, caso isso seja útil para outra pessoa: eu precisava exportar todos os certificados na cadeia do próprio servidor para a raiz, salvando cada um no formato base64, em seguida, copiar todos os certificados em um único arquivo e definir o ambiente variável REQUESTS_CA_BUNDLE para apontar para ele.

Obrigado novamente por sua ajuda!

Para outros Googlers - você pode desativar a verificação SSL em jenkinsapi usando:

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))

Encontrei o mesmo problema e falha na verificação do certificado SSL, ao revisar o código boto3, descobri que REQUESTS_CA_BUNDLE não está definido, então resolvi os dois problemas configurando-o manualmente:

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')

Para o aws-cli, acho que definir REQUESTS_CA_BUNDLE em ~ / .bashrc corrigirá esse problema (não testado porque meu aws-cli funciona sem ele)

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
Esta página foi útil?
0 / 5 - 0 avaliações