import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)
Si la URL usa un certificado autofirmado, esto falla con
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Sé que puedo pasar False
al verify
parámetro, así:
r = requests.post(url, data=data, verify=False)
Sin embargo, lo que me gustaría hacer es señalar las solicitudes a una copia de la clave pública en el disco y decirle que confíe en ese certificado.
python
ssl
python-requests
Matthew Moisen
fuente
fuente
Respuestas:
tratar:
r = requests.post(url, data=data, verify='/path/to/public_key.pem')
fuente
ssl.get_server_certificate
descargar un certificado(self-signed.badssl.com, 443)
, guardé ese certificado encert.pem
, y luego lo ejecutérequests.get('https://self-signed.badssl.com/', verify='cert.pem')
y todavía falló con un error de SSL (ese certificado está autofirmado).Con el
verify
parámetro puede proporcionar un paquete de autoridad certificadora personalizadoDe los documentos :
fuente
cert=(...)
es SOLO para SSL de cliente , también conocido como TLS mutuo. Si bien es interesante, es mucho más raro y realmente no se trata de la pregunta.Lo más fácil es exportar la variable
REQUESTS_CA_BUNDLE
que apunta a su autoridad de certificación privada o un paquete de certificados específico. En la línea de comando puede hacerlo de la siguiente manera:Si tiene su autoridad de certificación y no desea escribir el
export
cada vez, puede agregar elREQUESTS_CA_BUNDLE
a su de la~/.bash_profile
siguiente manera:echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile
fuente
El caso en el que se necesitan varios certificados se resolvió de la siguiente manera: Concatenar los archivos pem raíz múltiples, myCert-A-Root.pem y myCert-B-Root.pem, en un archivo. Luego, configure las solicitudes REQUESTS_CA_BUNDLE var en ese archivo en mi ./.bash_profile.
$ cp myCert-A-Root.pem ca_roots.pem $ cat myCert-B-Root.pem >> ca_roots.pem $ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile
fuente
La configuración
export SSL_CERT_FILE=/path/file.crt
debería hacer el trabajo.fuente
REQUESTS_CA_BUNDLE
variable no tiene ningún efecto en mi caso).En caso de que alguien aterrice aquí (como lo hice yo) y busque agregar una CA (en mi caso Charles Proxy) para httplib2, parece que puede agregarlo al
cacerts.txt
archivo incluido con el paquete de python.Por ejemplo:
Las variables de entorno a las que se hace referencia en otras soluciones parecen ser específicas de las solicitudes y no fueron recogidas por http:
fuente
Puede intentar:
settings = s.merge_environment_settings(prepped.url, None, None, None, None)
Puede leer más aquí: http://docs.python-requests.org/en/master/user/advanced/
fuente