Запрос Python не прикрепляет сертификат клиента к сеансу HTTPS

Я реализовал клиент SOAP на python с библиотекой zeep. Для некоторых конечных точек требуется аутентификация сертификата на стороне клиента, поэтому необходимо прикрепить сертификат к сеансу запросов python. Погуглив, я придумал:

    from zeep import Client
    from zeep.transports import Transport
    from django.utils import timezone
    import requests
    ......
    session = requests.Session()    
    session.verify = False
    session.cert= ('pat_to_cert.pem','path_to_privKey.pem')
    transport = Transport(session=session)
    ....
    client = Client(wsdl=wsdl, transport=transport)
    send = getattr(service, service_name)
    result = send(**data)

При отладке рукопожатия TLS сервер отправляет запрос сертификата, но клиент отвечает пустым сертификатом. Я уже проверил файлы .pem с помощью openssl без ошибок.

Возможно ли, что запросы python не прикрепляют сертификат, потому что он не распознает имя сервера? Как я могу заставить использовать этот сертификат для каждого запроса?


person Marco Spaziani Brunella    schedule 28.04.2020    source источник


Ответы (1)


В вашем коде вы устанавливаете session.verify = False, поэтому проверка TLS отключена.

что вам нужно сделать, это установить:

session.verify = 'path/to/my/certificate.pem'

Кроме того, вместо использования session.verify вы можете использовать session.cert, если вы просто хотите использовать сертификат клиента TLS:

session.verify = True
session.cert = ('my_cert', 'my_key')

дополнительные сведения см. в документации: https://docs.python-zeep.org/en/master/transport.html

надеюсь это поможет

person Tarique    schedule 01.05.2020
comment
Проверка предназначена только для сертификата сервера, я думаю, проблема связана с сертификатом на стороне клиента. - person Marco Spaziani Brunella; 02.05.2020
comment
ну да это так. ты пробовал session.verify = True с session.cert= ('pat_to_cert.pem','path_to_privKey.pem') - person Tarique; 02.05.2020
comment
я также обновил свой ответ для него. это решило проблему? пожалуйста, дайте нам знать. если да, то отметьте ответ как принятый. - person Tarique; 04.05.2020
comment
К сожалению нет! Я использовал вашу вторую версию: client.transport.session.verify = True client.transport.session.cert =('file.cert', 'file.pem') - person Marco Spaziani Brunella; 29.05.2020