Python Requests throwing SSLError

前端 未结 24 2650
小蘑菇
小蘑菇 2020-11-22 02:49

I\'m working on a simple script that involves CAS, jspring security check, redirection, etc. I would like to use Kenneth Reitz\'s python requests because it\'s a great piec

相关标签:
24条回答
  • 2020-11-22 03:37

    I was having a similar or the same certification validation problem. I read that OpenSSL versions less than 1.0.2, which requests depends upon sometimes have trouble validating strong certificates (see here). CentOS 7 seems to use 1.0.1e which seems to have the problem.

    I wasn't sure how to get around this problem on CentOS, so I decided to allow weaker 1024bit CA certificates.

    import certifi # This should be already installed as a dependency of 'requests'
    requests.get("https://example.com", verify=certifi.old_where())
    
    0 讨论(0)
  • 2020-11-22 03:38

    If you want to remove the warnings, use the code below.

    import urllib3
    
    urllib3.disable_warnings()
    

    and verify=False with request.get or post method

    0 讨论(0)
  • 2020-11-22 03:38

    As mentioned by @Rafael Almeida, the problem you are having is caused by an untrusted SSL certificate. In my case, the SSL certificate was untrusted by my server. To get around this without compromising security, I downloaded the certificate, and installed it on the server (by simply double clicking on the .crt file and then Install Certificate...).

    0 讨论(0)
  • 2020-11-22 03:39

    Too late to the party I guess but I wanted to paste the fix for fellow wanderers like myself! So the following worked out for me on Python 3.7.x

    Type the following in your terminal

    pip install --upgrade certifi      # hold your breath..
    

    Try running your script/requests again and see if it works (I'm sure it won't be fixed yet!). If it didn't work then try running the following command in the terminal directly

    open /Applications/Python\ 3.6/Install\ Certificates.command  # please replace 3.6 here with your suitable python version
    
    0 讨论(0)
  • 2020-11-22 03:40

    In case you have a library that relies on requests and you cannot modify the verify path (like with pyvmomi) then you'll have to find the cacert.pem bundled with requests and append your CA there. Here's a generic approach to find the cacert.pem location:

    windows

    C:\>python -c "import requests; print requests.certs.where()"
    c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
    

    linux

    #  (py2.7.5,requests 2.7.0, verify not enforced)
    root@host:~/# python -c "import requests; print requests.certs.where()"
    /usr/lib/python2.7/dist-packages/certifi/cacert.pem
    
    #  (py2.7.10, verify enforced)
    root@host:~/# python -c "import requests; print requests.certs.where()"
    /usr/local/lib/python2.7/dist-packages/requests/cacert.pem
    

    btw. @requests-devs, bundling your own cacerts with request is really, really annoying... especially the fact that you do not seem to use the system ca store first and this is not documented anywhere.

    update

    in situations, where you're using a library and have no control over the ca-bundle location you could also explicitly set the ca-bundle location to be your host-wide ca-bundle:

    REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com';)"
    
    0 讨论(0)
  • 2020-11-22 03:40

    It is not feasible to add options if requests is being called from another package. In that case adding certificates to the cacert bundle is the straight path, e.g. I had to add "StartCom Class 1 Primary Intermediate Server CA", for which I downloaded the root cert into StartComClass1.pem. given my virtualenv is named caldav, I added the certificate with:

    cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem
    cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem
    

    one of those might be enough, I did not check

    0 讨论(0)
提交回复
热议问题