-->

Airbrake error: urlopen error [SSL: CERTIFICATE_VE

2019-08-22 09:54发布

问题:

I had set up Airbrake to work in a Django project using pybrake, but 12 days ago it stopped working and I'm trying to debug the problem.

I've created a little 'test project' with a Pipfile and an airbrake_test.py (where I've scrambled the project key and ID):

(pybrake_test2-cU2-tsuL) bash-3.2$ ls
Pipfile         Pipfile.lock        airbrake_test.py

Here is the airbrake_test.py:

import os
import logging
import pybrake

os.environ['AIRBRAKE_PROJECT_ID'] = '112113'
os.environ['AIRBRAKE_PROJECT_KEY'] = '6e936fee123asdfasdf71445de0'


notifier = pybrake.Notifier(project_id=os.getenv('AIRBRAKE_PROJECT_ID'),
                            project_key=os.getenv('AIRBRAKE_PROJECT_KEY'),
                            environment='staging')


airbrake_handler = pybrake.LoggingHandler(notifier=notifier,
                                          level=logging.ERROR)

logger = logging.getLogger('test')
logger.addHandler(airbrake_handler)


def run():
    logger.error('something bad happened')


if __name__ == "__main__":
    run()

Here is the Pipfile used with pipenv:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
pybrake = "==0.3.3"

[dev-packages]

[requires]
python_version = "3.7"

I've tested that this works; if I run the script, I get an error about pybrake not being able to find a .git directory, but other than that, no errors:

(pybrake_test2-cU2-tsuL) bash-3.2$ python airbrake_test.py
2018-08-09 12:42:56,850 - pybrake - ERROR - get_git_revision failed: [Errno 2] No such file or directory: '/Users/kurtpeek/Documents/Scratch/pybrake_test2/.git/HEAD'

I also see the error show up in my Airbrake console:

I've copied the exact same script to my 'actual' project directory, in a subdirectory scripts (and named it airbrake_test2.py):

(lucy-web-CVxkrCFK) bash-3.2$ find . -name 'airbrake_test2*'
./scripts/airbrake_test2.py

However, if I try to run it, I get an "unable to get local issuer certificate" error:

(lucy-web-CVxkrCFK) bash-3.2$ python scripts/airbrake_test2.py
2018-08-09 12:47:08,087 - pybrake - ERROR - get_git_revision failed: [Errno 2] No such file or directory: '/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/.git/HEAD'
2018-08-09 12:47:08,434 - pybrake - ERROR - <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)>

I'm pretty nonplussed as to why it is working in the 'test' project, but not in the 'real' one. Here is the Pipfile for the 'real' project:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
# AWS SDK for Python
boto3 = "==1.7.61"
# Use DATABASE_URL env variable to configure Django application
dj-database-url = "==0.5.0"
# Web framework
django = "==2.0.7"
# Django email integration for transactional ESPs
"django-anymail[mailgun]" = "==3.0"
# Log of changes made to a model
django-auditlog = "==0.4.5"
# Compresses linked and inline JavaScript or CSS into a single cached file
django-compressor = "==2.2"
# Save and retrieve current request object anywhere in your code
django-crequest = "==2018.5.11"
# Blocks people from brute forcing login attempts
django-defender = "==0.5.5"
# Wrap standard Django fields with encryption
django-encrypted-model-fields = "==0.5.5"
# Custom extensions for the Django Framework
django-extensions = "==2.1.0"
# A set of high-level abstractions for Django forms
django-formtools = "==2.1"
# Import and export data in multiple formats (Excel, CSV, JSON, and so on)
django-import-export = "==1.0.1"
# Using more than one form in a single view
django-multi-form-view = "==2.0.0"
# OAuth2 for Django
django-oauth-toolkit = "==1.2.0"
# SASS integration
django-sass-processor = "==0.7"
# Collection of custom storage backends for Django
django-storages = "==1.6.6"
# Two-Factor Authentication for Django
django-two-factor-auth = "==1.7.0"
# Tweak the form field rendering in templates
django-widget-tweaks = "==1.4.2"
# Toolkit for building Web APIs
djangorestframework = "==3.8.2"
# Versioning of Django Rest Framwork API representations
djangorestframework-version-transforms = "==0.5.0"
# Fixtures replacement
factory-boy = "==2.11.1"
# Style Guide Enforcement
flake8 = "==3.5.0"
# Allows tests to travel through time by mocking the datetime module
freezegun = "==0.3.10"
# Python WSGI HTTP Server
gunicorn = "==19.9.0"
# SASS support
libsass = "==0.14.5"
# Newrelic adapter
newrelic = "==3.4.0.95"
# Parsing, formatting, and validating international phone numbers
phonenumbers = "==8.9.10"
# Imaging processing library
pillow = "==5.2.0"
# PostgreSQL adapter
psycopg2 = "==2.7.3"
# Python exception notifier for Airbrake
pybrake = "==0.3.3"
# ISO databases for languages, countries and subdivisions
pycountry = "==18.5.26"
# Extensions to the standard datetime module
python-dateutil = "==2.6.0"
# Loads environment variables from .env file
python-dotenv = "==0.8.2"
# Python wrapper for the Intercom API
python-intercom = "==3.1.0"
# HTTP library
requests = "==2.19.1"
# Python library to capitalize strings
titlecase = "==0.12.0"
# Communication with the Twilio API
twilio = "==6.15.1"
# Static file serving
whitenoise = "==3.3.1"

[dev-packages]
# Tab completion, syntax highlighting, better tracebacks for ipython
ipdb = "==0.11"
# Interactive Python shell
ipython = "==6.4.0"

[requires]
python_version = "3.7.0"

As you can see, the version of pybrake is exacly the same as in the 'test' project (version 0.3.3); the only difference I can think of is that the python_version is 3.7 in the 'test' project and 3.7.0 in the 'real' one.

Any idea why I'm getting this error?

回答1:

Following Airbrake's support, I managed to fix the problem by running the Install Certificates.command in /Applications/Python 3.7 (on my Mac):

Kurts-MacBook-Pro-2:Python 3.7 kurtpeek$ pwd
/Applications/Python 3.7
Kurts-MacBook-Pro-2:Python 3.7 kurtpeek$ sudo ./"Install Certificates.command"
 -- pip install --upgrade certifi
The directory '/Users/kurtpeek/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/kurtpeek/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already up-to-date: certifi in /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages (2018.4.16)
 -- removing any existing file or link
 -- creating symlink to certifi certificate bundle
 -- setting permissions
 -- update complete

Now the error raised by urlopen() has disappeared:

(lucy-web-CVxkrCFK) bash-3.2$ python scripts/airbrake_test2.py
2018-08-09 13:01:09,867 - pybrake - ERROR - get_git_revision failed: [Errno 2] No such file or directory: '/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/.git/HEAD'

and I see the error in our Airbrake console again.