urllib2: “SSL: CERTIFICATE_VERIFY_FAILED” Error (python 2.7.9+)

from:http://stackoverflow.com/questions/27835619/ssl-certificate-verify-failed-error

If you just want to bypass verification, you can create a new SSLContext. By default newly created contexts use CERT_NONE.

Be carefull with this as stated in section 17.3.7.2.1

When calling the SSLContext constructor directly, CERT_NONE is the default. Since it does not authenticate the other peer, it can be insecure, especially in client mode where most of time you would like to ensure the authenticity of the server you’re talking to. Therefore, when in client mode, it is highly recommended to use CERT_REQUIRED.

But if you just want it to work now for some other reason you can do the following, you’ll have to import ssl as well:

This should get round your problem but you’re not really solving any of the issues, but you won’t see the [SSL: CERTIFICATE_VERIFY_FAILED] because you now aren’t verifying the cert!

To add to the above, if you want to know more about why you are seeing these issues you will want to have a look at PEP 476.

This PEP proposes to enable verification of X509 certificate signatures, as well as hostname verification for Python’s HTTP clients by default, subject to opt-out on a per-call basis. This change would be applied to Python 2.7, Python 3.4, and Python 3.5.

There is an advised opt out which isn’t dissimilar to my advice above:

It also features a highly discouraged option via monkeypatching which you don’t often see in python:

Which overrides the default function for context creation with the function to create an unverified context. This highly discouraged option can be seen in the wild here!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注