Сбой проверки сертификата SSLError только в Linux, но работает в Windows - PullRequest
0 голосов
/ 21 февраля 2019

У нас есть интерфейс, который позволяет отправлять запросы на веб-сервер для определенных данных.

Чтобы подготовить запрос с использованием сеанса, который будет отправлен на сервер, я создаю HTTPSAdapter

class HTTPSAdapter(HTTPAdapter):
"""HTTPS adapter that uses windows certificate stores"""
def init_poolmanager(
    self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs
):
    self.poolmanager= PoolManager(
        num_pools=connections,
        maxsize=maxsize,
        block=block,
        ssl_context=ssl.create_default_context(),
        **pool_kwargs
    )

Используя этот адаптер, я создаю сеанс с указанным max_retries:

class SessionWithDefaultSslContext(requests.Session):
def __init__(self, retries, backoff_factor, status_forcelist):
    super(SessionWithDefaultSslContext, self).__init__()
    retry = Retry(
        total=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    self.mount('http://', HTTPAdapter(max_retries=retry))
    self.mount('https://', HTTPSAdapter(max_retries=retry))
def requests_retry_session(
self,
retries=3,
backoff_factor=0.3,
status_forcelist=(429, 503),
session=None,
):
     """Create a session with retry and backoff
     Got from here:
         https://www.peterbe.com/plog/best-practice-with-retries-with-requests

     @param retries: number of times to retry
     @param backoff_factor: scaling factor for exponential backoff
     @param status_forcelist: errors to force retry
     @param session: the session
     @return: session with retry
     """
     session = session or SessionWithDefaultSslContext(retries, backoff_factor, status_forcelist)

     return session

И, наконец, отправляю запрос на разные конечные точки с помощью:

        with self.requests_retry_session() as session:
        r = session.post(url,
                         auth=self.get_credentials(),
                         json=data,
                         verify=True)
    return r.status_code == requests.codes.created, r.json()

Япроходя аутентификацию на этом сервере, используя имя пользователя и пароль, а также добавив переменную среды

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

Запросы с этого интерфейса работают нормально в Windows, но в Linux

requests.exceptions.SSLError: HTTPSConnectionPool(host='url', port=443): Max retries exceeded with url: /rest-api/target_builds/ (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)'),))
выдает следующую ошибку
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...