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