python - requests - el uso de solicitudes con TLS no da soporte SNI
requests python sessions (5)
Estoy usando solicitudes para comunicarme con una aplicación django pero
Cuando intento
requests.get(''https://mysite.com'', verify=True)
Me sale el error:
nombre de host ''mysite.com'' no coincide con ''* .myhost.com'', ''myhost.com''
Sin embargo, cuando miro el navegador, o http://www.digicert.com/help/ el certificado se ve bien y elegante.
Mi anfitrión sugirió que era la falta de soporte de SNI a partir de las solicitudes (y Github parece confirmar que https://github.com/kennethreitz/requests/issues/749 ). ¿Alguien ha encontrado una solución alternativa utilizando las solicitudes?
Instale un módulo de solicitudes como este. Esto instalará los extras del paquete de seguridad.
pip install requests[security]
La respuesta de @Lukasa es correcta con las solicitudes presentes (de github). Recuerde agregar OpenSSL en su sistema además de las dependencias de pip que menciona.
Si por razones de implementación prefiere una versión estable de solicitudes como 1.2.3 in pip, puede parchear el mono para trabajar con SNI de esta manera:
import requests
def fileno(self):
return self.socket.fileno()
def close(self):
return self.connection.shutdown()
requests.pyopenssl.WrappedSocket.close = close
requests.pyopenssl.WrappedSocket.fileno = fileno
La versión actual de las Solicitudes debería estar bien con SNI. Más abajo en el número de GitHub puede ver los requisitos:
Intenta instalar esos paquetes y luego dale otra oportunidad.
EDITAR : a partir de las Solicitudes v2.12.1, ndg-httpsclient y pyasn1 ya no son necesarios. La lista completa de paquetes requeridos ahora es:
- pyOpenSSL
- idna
O simplemente puede usar Python 2.7.9 y superior:
"La totalidad del módulo ssl de Python 3.4 ha sido respaldado para Python 2.7.9. Ver PEP 466 para justificación".
Para poder obtener la respuesta aceptada para el trabajo, tuve que instalar muchos otros paquetes, en este orden:
- yum instalar libffi-devel
- yum install gcc
- yum install openssl-devel
- pip install urllib3
- pip install pyopenssl
- pip install ndg-httpsclient
- pip install pyasn1