How to disable hostname checking in requests python

python, python-requests, ssl

Solution

Requests doesn't allow this directly, however you can provide a custom transport adapter which uses the features of the underlying `urllib3`. The usage of transport adapters is covered in the requests documentation.

This code is not tested, but should work.

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager


# Never check any hostnames
class HostNameIgnoringAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       assert_hostname=False)


# Check a custom hostname
class CustomHostNameCheckingAdapter(HTTPAdapter):
    def cert_verify(self, conn, url, verify, cert):
        #      implement me
        host = custom_function_mapping_url_to_hostname(url)
        conn.assert_hostname = host
        return super(CustomHostNameCheckingAdapter,
                     self).cert_verify(conn, url, verify, cert)

In detail the `assert_hostname` param works as follows: If `None` use the hostname from the URL, if `False` suppress hostname checking, if a custom string validate against this string.

Problem

I'm using Requests to connect to a RESTful API. The server I would like to reach use ssl with self-singed certificate. ``` cafile = "gateway.pem" r = requests.get(request, auth=('admin', 'password'), verify=cafile) ``` the problem is I'm getting SSLError of hostname mismatch. there should be a way to disable the hostname checking without disabling certificate validation, as in many java implementations, but I can't find how to do it with requests in python. stacktrace: ``` Traceback (most recent call last): File "<pyshell#43>", line 1, in <module> r = requests.get(request, auth=("admin", "password"), verify='gateway.pem') File "C:\Python27\lib\site-packages\requests-2.0.0-py2.7.egg\requests\api.py", line 55, in get return request('get', url, **kwargs) File "C:\Python27\lib\site-packages\requests-2.0.0-py2.7.egg\requests\api.py", line 44, in request return session.request(method=method, url=url, **kwargs) File "C:\Python27\lib\site-packages\requests-2.0.0-py2.7.egg\requests\sessions.py", line 357, in request resp = self.send(prep, **send_kwargs) File "C:\Python27\lib\site-packages\requests-2.0.0-py2.7.egg\requests\sessions.py", line 460, in send r = adapter.send(request, **kwargs) File "C:\Python27\lib\site-packages\requests-2.0.0-py2.7.egg\requests\adapters.py", line 358, in send raise SSLError(e) SSLError: hostname '10.76.92.70' doesn't match u'lital.com' ``` How can this be done?

Original source

Related problems