requests headers espaƱol python python-2.7 urllib2 python-requests

headers - urllib request python 3 post



Python ignora la validaciĆ³n del certificado urllib2 (6)

Quiero ignorar la certification validation durante mi solicitud al servidor con un enlace corporativo interno.

Con la biblioteca de requests Python, haría esto:

r = requests.get(link, allow_redirects=False,verify=False)

¿Cómo hago lo mismo con la biblioteca urllib2?


De acuerdo con la publicación de @Enno Gröper, probé el constructor SSLContext y funciona bien en mi máquina. código de la siguiente manera:

import ssl ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) urllib2.urlopen("https://your-test-server.local", context=ctx)

si necesita abrelatas, simplemente agregó este contexto como:

opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx))

NOTA: todo el entorno de prueba anterior es python 2.7.12 . Yo uso PROTOCOL_SSLv23 aquí ya que el doc dice, otro protocolo también podría funcionar, pero depende de su máquina y servidor remoto, por favor revise el documento para más detalles.


La forma más fácil:

python 2

import urllib2, ssl request = urllib2.Request(''https://somedomain.co/'') response = urllib2.urlopen(request, context=ssl._create_unverified_context())

python 3

from urllib.request import urlopen import ssl response = urlopen(''https://somedomain.co'', context=ssl._create_unverified_context())


Mientras tanto, urllib2 parece verificar los certificados del servidor por defecto. La advertencia, que se mostró en el pasado documentation. para 2.7.9 y actualmente encontré este problema en un entorno de prueba con un certificado autofirmado (y Python 2.7.9).

Mi solución malvada (¡no hagas esto en producción!):

import urllib2 import ssl ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE urllib2.urlopen("https://your-test-server.local", context=ctx)

De acuerdo con los documentos que llaman directamente al constructor de SSLContext también debería funcionar. No he intentado eso.


Para aquellos que usan un abridor, puedes lograr lo mismo basado en la gran respuesta de Enno Gröper:

import urllib2, ssl ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx), your_first_handler, your_second_handler[...]) opener.addheaders = [(''Referer'', ''http://example.org/blah.html'')] content = opener.open("https://localhost/").read()

Y luego úsalo como antes.

Según build_opener y HTTPSHandler , se agrega un HTTPSHandler si existe un módulo ssl , aquí solo especificamos el nuestro en lugar del predeterminado.


Un ejemplo más explícito, construido sobre el código de Damien (llama a un recurso de prueba en http://httpbin.org/ ). Para python3. Tenga en cuenta que si el servidor redirecciona a otra URL, uri en add_password debe contener la nueva URL raíz (también es posible pasar una lista de URL).

import ssl import urllib.parse import urllib.request def get_resource(uri, user, passwd=False): """ Get the content of the SSL page. """ uri = ''https://httpbin.org/basic-auth/user/passwd'' user = ''user'' passwd = ''passwd'' context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, uri, user, passwd) auth_handler = urllib.request.HTTPBasicAuthHandler(password_mgr) opener = urllib.request.build_opener(auth_handler, urllib.request.HTTPSHandler(context=context)) urllib.request.install_opener(opener) return urllib.request.urlopen(uri).read()


urllib2 no verifica el certificado del servidor por defecto. Verifique esta documentation.

Editar: Como se señala en el siguiente comentario, esto ya no es cierto para las versiones más recientes (parece que> = 2.7.9) de Python. Consulte la ANSWER siguiente