我有一个Python脚本,应该从我们的服务器通过互联网访问各种Web API。 问题是,从支持NTLM身份validation的angular度来看,我所看到的Python支持很差。 这导致我们的公司代理服务器总是返回HTTP代码407.我最初的想法是使用IIS和应用程序请求路由模块设置本地代理服务器,该模块在处理NTLM身份validation时将所有请求转发给我们的公司代理。 这种方法的问题是,它似乎并没有转发我的NTLM凭据,当前用户正在运行Python脚本。
这种方法会起作用吗? 如果是这样,我该如何执行?
你看过这些吗?
NTLM授权代理服务器
Python NTLM
我知道这是一个非常古老的问题,但是我所看到的所有答案都要求您将NTLM凭据input到某种Python NTLM代理处理代码中。 根据我的经验,这些代理也很容易出问题。 我为Windows创build了一个解决scheme,它将自动检测企业代理系统configuration,并自动使用当前用户的凭证执行NTLM身份validation。 此解决scheme使用pywin32和COM调用。 这不是很好,但它运作良好,所以我想要通过它,以帮助别人。
在这个例子中,我展示了如何做一个POST,但其他types的请求应该很容易从这个代码中找出来:
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'))
可能会有点迟,但是还是想提一下。 毫无疑问,在您的脚本中提供NTLM支持将会很好,但这样会增加复杂性,导致无法获得丰厚回报。 可能最好使用NTLMAps,Cntlm或Px。
NTLMAps和Cntlm是作为中介代理执行NTLM身份validation的代理。 但是,他们都需要用户/通行证,因为他们主要针对Linux用户。 我历史上在Windows上使用这些工具,但同样的要求,必须提供凭据给他们,每更新一次我的密码更改恼怒。
因此,我已经为Windows创build了Px,这是一个类似于上述两者的HTTP代理,但使用SSPI来pipe理公司代理所需的身份validation。 所有你需要configuration的是代理服务器和端口。
为了开发自己的应用程序,代码还应该帮助弄清楚如何在Python中以及可能访问SSPI的其他语言中执行此操作。 但是,你宁愿孤立NTLM的混乱,而不是干涉它。