Encaminhar autenticação NTLM ao proxy corporativo do servidor proxy local

5

Eu tenho um script Python que supostamente acessa várias APIs da Web do nosso servidor até a Internet. A questão é que o suporte do Python pelo que eu vi é muito ruim quando se trata de suportar a autenticação NTLM. Isso faz com que nosso servidor proxy corporativo sempre retorne o código HTTP 407. Minha ideia inicial era configurar um servidor proxy local usando o IIS e o módulo Application Request Routing, que encaminharia todas as solicitações ao nosso proxy corporativo ao manipular a autenticação NTLM. Problema com essa abordagem é que ele não parece estar encaminhando minhas credenciais do NTLM, do qual o usuário atual está executando o script Python.

Essa abordagem funcionará? Se sim, como posso implementá-lo?

    
por self. 24.09.2014 / 14:57

3 respostas

2

Você deu uma olhada nestes?

Servidor Proxy de Autorização NTLM

NTLM em Python

    
por 24.09.2014 / 15:43
6

Pode ser um pouco tarde, mas queria mencionar isso mesmo assim. Sem dúvida, ter suporte ao NTLM em seu script seria ótimo, mas isso aumentaria a complexidade sem grandes retornos. Pode ser melhor usar NTLMAps, Cntlm ou Px.

NTLMAps e Cntlm são proxies que fazem a autenticação NTLM como um proxy intermediário. No entanto, ambos exigem o usuário / passe, uma vez que são direcionados principalmente para usuários Linux. Eu usei historicamente essas ferramentas no Windows, mas fiquei incomodado com o mesmo requisito de ter que fornecer as credenciais para elas e atualizá-las sempre que minha senha fosse alterada.

Como resultado, eu criei o Px para Windows que é um proxy HTTP como os dois acima, mas usa o SSPI para gerenciar a autenticação necessária com o proxy corporativo. Tudo o que você precisa configurar é o servidor proxy e a porta.

Para desenvolver seus próprios aplicativos, o código também deve ajudar a descobrir como fazer isso no Python e talvez em outros idiomas que tenham acesso ao SSPI. Mas você preferiria isolar a bagunça do NTLM e não interferir nela.

    
por 09.09.2016 / 21:00
2

Eu sei que esta é uma pergunta muito antiga, mas todas as respostas que vi exigem que você insira suas credenciais NTLM em algum tipo de código de manipulação de proxy NTLM python. Esses proxies também são propensos a ter bugs, na minha experiência. Eu criei uma solução para o Windows, que detectará automaticamente as configurações do sistema proxy corporativo e também executará automaticamente a autenticação NTLM com as credenciais do usuário atual. Esta solução usa chamadas pywin32 e COM. Não é bonito, mas funciona bem, então eu queria passá-lo no caso de ajudar alguém.

No exemplo, mostro como fazer um POST, mas é fácil descobrir outros tipos de solicitações a partir desse código:

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'))
    
por 13.02.2016 / 01:59

Tags