Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting certificate verify failed error with mechanize

I'm getting this error when I try to run the code:

  File "C:\Python27\lib\site-packages\mechanize\_urllib2_fork.py", line 1118, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

I'm running this on Windows 8.1, I can open https with requests no problem, but not if I use mechanize I get the error. My code:

import mechanize


br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17')]

sign_in = br.open('https://www.amazon.com/ap/signin?_encoding=UTF8&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon.com%2Fgp%2Fcss%2Fhomepage.html%3Fie%3DUTF8%26ref_%3Dnav_yam_ya')

br.select_form(name="signIn")
br["email"] = 'username'
br['password'] = 'password'
logged_in = br.submit()
like image 812
leakybytes Avatar asked Jan 02 '15 01:01

leakybytes


2 Answers

I find the following workaround works for me in case not having the newest version of python or mechanize. Add the following code before calling br.open():

import socket
import httplib
import ssl
def connect(self):
    sock = socket.create_connection((self.host, self.port),
                                self.timeout, self.source_address)
    if self._tunnel_host:
    self.sock = sock
    self._tunnel()

    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1)

httplib.HTTPSConnection.connect = connect
like image 152
ayao Avatar answered Nov 11 '22 14:11

ayao


Put this before you block of code of mechanize it will work like charm

import ssl

try:
    make_non_ssl_context = ssl._create_verified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = make_non_ssl
like image 1
droid Avatar answered Nov 11 '22 14:11

droid