Windows: проверка сертификата Python SSL не удалась

1

Я установил 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 будут работать.

Любые идеи приветствуются.

  • 0
    Когда вы вызываете API GoogleAnalytics, как часть SSL Handshake, он представляет свой сертификат. Вы должны иметь сертификат эмитента сертификата, представленного для прохождения рукопожатия. Итак, вам нужно получить его и добавить в свой магазин.
  • 0
    Привет @Jay Джей, спасибо за твой ответ. К сожалению, я не до конца понимаю ответ. Я добавил корневой сертификат компании к сертификации. Нужно ли добавить его во второй магазин, чтобы подтвердить подтверждение? Я не очень разбираюсь в SSL в целом. За пределами сети нашей компании те же запросы из библиотек Python работают без проблем.
Теги:
ssl
get

3 ответа

0

Я потратил несколько дней на выяснение того, как решить эту проблему. Наконец, я добавляю сертификат CA моей компании в файл конфигурации, используемый библиотекой запросов. Вы можете проверить путь к этому файлу:

import requests as r
print(r.certs.where())

Просто добавьте сертификат внизу страницы!

  • 0
    Можете ли вы сказать дно где? у меня есть файл .pem из печати (r.certs.where ()), и я использовал r = запросы.get (" mycompany.com/home ", cert = "C: /.../ site-packages / certifi / cacert.pem "). Все еще получил ту же ошибку, как указано выше
  • 0
    Откройте файл .pem, который вы нашли в текстовом редакторе, прокрутите до конца файла и вставьте туда свой сертификат.
0

Вы можете 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)
  • 0
    Спасибо, но это означало бы больше безопасности через SSL, верно?
  • 0
    Правильно. С помощью этой опции соединение все еще будет зашифровано через SSL, но сертификат не будет проверен. Используйте этот метод, если вам не удается установить правильный корневой сертификат.
0

Я добился прогресса. httplib2 - это пакет, который вызвал проблемы. У него есть собственный cacerts.txt, где я также добавил корневой сертификат.

Ура,

Andreas

Ещё вопросы

Сообщество Overcoder
Наверх
Меню