Назад | Перейти на главную страницу

Перенаправить NTLM-аутентификацию на корпоративный прокси-сервер с локального прокси-сервера

У меня есть скрипт Python, который должен получать доступ к различным веб-API с нашего сервера через Интернет. Проблема в том, что поддержка Python из того, что я видел, довольно слабая, когда дело доходит до поддержки аутентификации NTLM. Это заставляет наш корпоративный прокси-сервер всегда возвращать HTTP-код 407. Моя первоначальная идея заключалась в том, чтобы настроить локальный прокси-сервер с использованием IIS и модуля маршрутизации запросов приложений, который пересылал бы все запросы на наш корпоративный прокси-сервер при обработке аутентификации NTLM. Проблема с этим подходом заключается в том, что он не пересылает мои учетные данные NTLM, из которых текущий пользователь запускает скрипт Python.

Будет ли этот подход работать? Если да, то как я могу это реализовать?

Может быть, немного поздно, но все же хотел об этом упомянуть. Несомненно, наличие поддержки NTLM в вашем сценарии было бы здорово, но это добавило бы сложности и не принесло большой отдачи. Возможно, лучше всего использовать NTLMAps, Cntlm или Px.

NTLMAps и Cntlm - это прокси, которые выполняют NTLM-аутентификацию в качестве промежуточного прокси. Тем не менее, они оба требуют user / pass, поскольку они в основном ориентированы на пользователей Linux. Исторически я использовал эти инструменты в Windows, но меня раздражало одно и то же требование предоставлять им учетные данные и обновлять их каждый раз при изменении моего пароля.

В результате я написал Px для Windows который является HTTP-прокси, подобным двум вышеупомянутым, но использует SSPI для управления необходимой аутентификацией с корпоративным прокси. Все, что вам нужно настроить, это прокси-сервер и порт.

Для разработки собственных приложений код также должен помочь понять, как это сделать в Python и, возможно, на других языках, имеющих доступ к SSPI. Но вы бы предпочли изолировать беспорядок NTLM и не вмешиваться в него.

Я знаю, что это действительно старый вопрос, но все ответы, которые я видел, требуют, чтобы вы вводили свои учетные данные NTLM в какой-то код обработки прокси-сервера NTLM на Python. По моему опыту, эти прокси также подвержены ошибкам. Я создал решение для Windows, которое автоматически обнаруживает конфигурации корпоративной прокси-системы, а также автоматически выполняет аутентификацию NTLM с учетными данными текущего пользователя. Это решение использует вызовы pywin32 и COM. Это некрасиво, но работает хорошо, поэтому я хотел передать его на случай, если он поможет кому-то другому.

В этом примере я показываю, как выполнить POST, но другие типы запросов должны быть легко определены из этого кода:

import win32com.client

try:
    import _winreg as winreg
except:
    import winreg

class HTTP:
    proxy = ""
    isProxy = False

    def __init__(self):
        self.get_proxy()

    def get_proxy(self):
        oReg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
        oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
        dwValue = winreg.QueryValueEx(oKey, 'ProxyEnable')

        if dwValue[0] == 1:
            oKey = winreg.OpenKey(oReg, r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
            dwValue = winreg.QueryValueEx(oKey, 'ProxyServer')[0]
            self.isProxy = True
            self.proxy = dwValue

    def url_post(self, url, formData):
        httpCOM = win32com.client.Dispatch('Msxml2.ServerXMLHTTP.6.0')

        if self.isProxy:
            httpCOM.setProxy(2, self.proxy, '<local>')

        httpCOM.setOption(2, 13056)
        httpCOM.Open('POST', url, False)
        httpCOM.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
        httpCOM.setRequestHeader('User-Agent', 'whatever you want')

        httpCOM.send(formData)

        return httpCOM.responseText

http = HTTP()

print(http.url_post('http://ipecho.net/', 'test=1'))