Я установил Anaconda и имел проблемы с SSL при попытке выполнить вызовы API через Jupyter Notebooks:
import requests
import certifi
r = requests.get('https://github.com/')
print(r)
Сначала это вызвало ошибку подключения SSL. Что я мог бы решить после обширного поиска и помощи нашего ИТ-отдела. Решением здесь было добавление корневого сертификата компании в хранилище certifi cert.
Теперь, к сожалению, у меня все еще есть те же проблемы. Пример кода, вызывающего API Google Analytics с пакетом google2pandas:
from google2pandas import *
query = {
'reportRequests': [{
'viewId' : 37616054,
'dateRanges': [{
'startDate' : '8daysAgo',
'endDate' : 'today'}],
'dimensions' : [
{'name' : 'ga:date'},
{'name' : 'ga:pagePath'},
{'name' : 'ga:browser'}],
'metrics' : [
{'expression' : 'ga:pageviews'}],
'dimensionFilterClauses' : [{
'operator' : 'AND',
'filters' : [
{'dimensionName' : 'ga:browser',
'operator' : 'REGEXP',
'expressions' : ['Firefox']},
{'dimensionName' : 'ga:pagePath',
'operator' : 'REGEXP',
'expressions' : ['iPhone']}]
}]
}]
}
# Assume we have placed our client_secrets_v4.json file in the current
# working directory.
conn = GoogleAnalyticsQueryV4(secrets='Analytics.json')
df = conn.execute_query(query)
Здесь я до сих пор получаю сообщение об ошибке SSL, которое я имел и при простом вызове:
C:\ProgramData\Anaconda3\lib\ssl.py в _create (cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session) 848 # non-blocking 849 raise ValueError ("do_handshake_on_connect не следует указывать для неблокирующих сокеты ") → 850 self.do_handshake() 851 кроме (OSError, ValueError): 852 self.close()
C:\ProgramData\Anaconda3\lib\ssl.py в do_handshake (self, block)
1106, если таймаут == 0.0 и блок: 1107
self.settimeout (Нет) → 1108 self._sslobj.do_handshake() 1109 наконец: 1110 self.settimeout(timeout)SSLCertVerificationError: проверка сертификата SSL: CERTIFICATE_VERIFY_FAILED]: не удалось получить сертификат локального эмитента (_ssl.c: 1045)
Я считаю, что есть другая используемая библиотека, которая не полагается на certifi? Но я не знаю, где и как добавить свой корневой сертификат, поэтому все запросы iPython будут работать.
Любые идеи приветствуются.
Я потратил несколько дней на выяснение того, как решить эту проблему. Наконец, я добавляю сертификат CA моей компании в файл конфигурации, используемый библиотекой запросов. Вы можете проверить путь к этому файлу:
import requests as r
print(r.certs.where())
Просто добавьте сертификат внизу страницы!
Вы можете ssl.SSLSocket
метод __init__
ssl.SSLSocket
чтобы он всегда игнорировал проверку сертификата SSL, вызывая параметр cert_reqs=CERT_NONE
.
Добавьте это в начало своего скрипта:
import ssl
orig_sslsocket_init = ssl.SSLSocket.__init__
ssl.SSLSocket.__init__ = lambda *args, cert_reqs=ssl.CERT_NONE, **kwargs: orig_sslsocket_init(*args, cert_reqs=ssl.CERT_NONE, **kwargs)
Я добился прогресса. httplib2 - это пакет, который вызвал проблемы. У него есть собственный cacerts.txt, где я также добавил корневой сертификат.
Ура,
Andreas