Невозможно использовать DjangoRestFramework с запросами из-за самоподписанного сертификата в цепочке - PullRequest
0 голосов
/ 07 мая 2019

У меня есть 2 приложения Django, с которыми мне нужно общаться друг с другом через DjangoRestFramework. Приложения работают на серверах Windows, на которых работает Apache для обслуживания данных.

Они живут в отдельных блоках в моей инфраструктуре, и здесь мы используем самоподписанный сертификат для внутренних вещей, потому что это требование.

Когда я пытаюсь сделать запрос, он расстраивается из-за самоподписанного сертификата в цепочке и не завершает запрос.

Я сделал небольшую служебную функцию, которая обращается к API:

def get_future_assignments(user_id):
    """gets a users data from the API

    Arguments:
        user_id {int} -- user_id for a User
    """
    headers = {
        'User-Agent': 'Mozilla/5.0',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest'
        }
    api_app = settings.MY_API
    api_model = 'api_endpoint/'
    api_query = '?user_id='+str(user_id)
    json_response = requests.get(
        api_app+api_model+api_query,
        headers=headers,
        verify=False
    )
    return json.loads(json_response.content)

Использование verify=False позволяет конечной точке работать и возвращать соответствующие данные. Если я уберу его, произойдет сбой, сказав, что self-signed-cert in the chain, и вызов не будет завершен.

Общий макет выглядит следующим образом:

Сервер1: https - самоподписанный (server1.cer (выполнение вызова))

Сервер2: https - самоподписанный (server2.cer (API находится на этом сервере))

У меня есть корневой сертификат, который мы устанавливаем в браузерах и других организациях (rootcert.cer).

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

Я знаю, что есть cert аргумент, который можно использовать в запросах, но я не уверен, что туда вставить.

Я почти уверен, что мне нужно что-то вроде этого:

json_response = requests.get(
    api_app+api_model+api_query,
    headers=headers,
    cert= our_cert, # not sure which cert this would be...
    key= our_root_ca # do I need this? Not sure...
)

Но любая помощь от людей, которые знают сертификаты немного лучше, приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...