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?