el uso de solicitudes con TLS no da soporte SNI

Estoy usando solicitudes para comunicarme con una aplicación django pero

Cuando bash

requests.get('https://mysite.com', verify=True) 

Me sale el error:

el nombre de host ‘mysite.com’ no coincide con ninguno de ‘* .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 SNI de las solicitudes (y Github parece confirmar que https://github.com/kennethreitz/requests/issues/749 ). ¿Alguien ha encontrado una solución temporal utilizando solicitudes?

La versión actual de las solicitudes debe estar bien con SNI. Más abajo en el problema de GitHub puedes ver los requisitos:

  • pyOpenSSL
  • ndg-httpsclient
  • pyasn1

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

Para que la respuesta aceptada funcionara, tuve que instalar un montón de otros paquetes, en este orden:

  • yum instalar libffi-devel
  • yum instalar gcc
  • yum instalar openssl-devel
  • pip instalar urllib3
  • pip instalar pyopenssl
  • pip instalar ndg-httpsclient
  • pip instalar pyasn1

Instalar el módulo de solicitudes como este. Esto instalará los extras del paquete de seguridad.

pip install requests[security]

O simplemente puedes usar Python 2.7.9 y más:

“La totalidad del módulo ssl de Python 3.4 ha sido portada para Python 2.7.9. Consulte la PEP 466 para obtener una justificación”.

https://www.python.org/downloads/release/python-279/

La respuesta de @Lukasa es correcta con las solicitudes actuales (desde github). Recuerde agregar OpenSSL en su sistema también aparte de las dependencias de pip que él menciona.

Si, por razones de implementación, prefiere una versión de solicitudes estables como la 1.2.3 en pip, puede instalar un parche para que funcione 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 

Copie mi respuesta desde Acceso a sitios https con dirección IP

En MAC High Sierra y Python 3.6.4, probé la solución: solicita el cinturón de herramientas: HostHeaderSSLAdapter 1st, desafortunadamente, no me funciona, luego lo intenté por la fuerza , finalmente lo hice .

El autor explica todo lo que se encuentra en la parte del archivo Léame y ha proporcionado un script de ejemplo que puede seguirse fácilmente.

1.Instale la biblioteca por pip install requests[security] forcediphttpsadapter

2. ejecute el script de muestra:

 import requests from forcediphttpsadapter.adapters import ForcedIPHTTPSAdapter session = requests.Session() session.mount("https://example.com", ForcedIPHTTPSAdapter(dest_ip='1.2.3.4')) response = session.get( '/some/path', headers={'Host': 'example.com'}, verify=False) 

Nota: para algunos casos, es posible que deba eliminar el prefijo: ‘www’ de la URL.