HTTPS connection Python
I am trying to verify the that target exposes a https web service. I have code to connect via HTTP but I am not sure how to connect via HTTPS. I have read you use SSL but I have also read that it did not support certificate errors. The code I have got is from the python docs:
import httplib conn = httplib.HTTPConnection("www.python.org") conn.request("GET", "/index.html") r1 = conn.getresponse() print r1.status, r1.reason
Does anyone know how to connect to HTTPS?
I already tried the HTTPSConenction but it responds with an error code claiming httplib does not have attribute HTTPSConnection. I also don't have socket.ssl available.
I have installed Python 2.6.4 and I don't think it has SSL support compiled into it. Is there a way to integrate this suppot into the newer python without having to install it again.
I have installed OpenSSL and pyOpenSsl and I have tried the below code from one of the answers:
import urllib2 from OpenSSL import SSL try: response = urllib2.urlopen('https://example.com') print 'response headers: "%s"' % response.info() except IOError, e: if hasattr(e, 'code'): # HTTPError print 'http error code: ', e.code elif hasattr(e, 'reason'): # URLError print "can't connect, reason: ", e.reason else: raise
I have got an error:
Traceback (most recent call last): File "<stdin>", line 2, in <module> File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 87, in urlopen return opener.open(url) File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 203, in open return self.open_unknown(fullurl, data) File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 215, in open_unknown raise IOError, ('url error', 'unknown url type', type) IOError: [Errno url error] unknown url type: 'https'
Does anyone know how to get this working?
I have found out what the problem was, the Python version I was using did not have support for SSL. I have found this solution currently at: http://www.webtop.com.au/compiling-python-with-ssl-support.
The code will now work after this solution which is very good. When I import ssl and HTTPSConnection I know don't get an error.
Thanks for the help all.
Python 2.x: docs.python.org/2/library/httplib.html:
Note: HTTPS support is only available if the socket module was compiled with SSL support.
Python 3.x: docs.python.org/3/library/http.client.html:
Note HTTPS support is only available if Python was compiled with SSL support (through the ssl module).
#!/usr/bin/env python import httplib c = httplib.HTTPSConnection("ccc.de") c.request("GET", "/") response = c.getresponse() print response.status, response.reason data = response.read() print data # => # 200 OK # <!DOCTYPE html ....
To verify if SSL is enabled, try:
>>> import socket >>> socket.ssl <function ssl at 0x4038b0>
To check for ssl support in Python 2.6+:
try: import ssl except ImportError: print "error: no ssl support"
To connect via https:
import urllib2 try: response = urllib2.urlopen('https://example.com') print 'response headers: "%s"' % response.info() except IOError, e: if hasattr(e, 'code'): # HTTPError print 'http error code: ', e.code elif hasattr(e, 'reason'): # URLError print "can't connect, reason: ", e.reason else: raise
import requests r = requests.get("https://stackoverflow.com") data = r.content # Content of response print r.status_code # Status code of response print data
Why haven't you tried httplib.HTTPSConnection? It doesn't do SSL validation but this isn't required to connect over https. Your code works fine with https connection:
>>> import httplib >>> conn = httplib.HTTPSConnection("mail.google.com") >>> conn.request("GET", "/") >>> r1 = conn.getresponse() >>> print r1.status, r1.reason 200 OK
If using httplib.HTTPSConnection:
Please take a look at: Changed in version 2.7.9:
This class now performs all the necessary certificate and hostname checks by default. To revert to the previous, unverified, behavior ssl._create_unverified_context() can be passed to the context parameter. You can use:
if hasattr(ssl, '_create_unverified_context'): ssl._create_default_https_context = ssl._create_unverified_context
Assuming SSL support is enabled for the
connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
I had some code that was failing with an
HTTPConnection (MOVED_PERMANENTLY error), but as soon as I switched to
HTTPS it worked perfectly again with no other changes needed. That's a very simple fix!