我使用HTTP代理在公司Windows网络(我登录)上工作。当我使用Internet Explorer时,它神奇地使用代理而无需输入我的密码。某些其他程序似乎也管理这个,例如JavaWebStart有一个“使用浏览器设置”选项。
然而,当我使用像curl或wget这样的脚本/程序来从http获取内容,或者在我的Java代码中执行它时,我似乎需要将我的密码存储在某处,这显然不是最好的安全性。
如何以编程方式获取Internet Explorer具有的无密码访问权限?
我认为这是一个堆栈溢出问题,因为我是程序员而且我需要我的程序/脚本才能在不输入密码的情况下工作,尽管我可以看到其他人可能认为它属于Server Fault / Superuser。
我知道像curl中的--proxy-ntlm这样的设置,但是这仍然需要一个ntlm用户名和密码。
答案 0 :(得分:46)
如果没有其他人的答案,我发现了这个,我希望它对其他人有用。
curl.exe -U : --proxy-ntlm --proxy myproxy.com:8080 http://www.google.com
使用Windows登录机制进行身份验证的神奇短语是 SSPI 。这给了一个很好的谷歌搜索短语。我仍然没有找到一种在Java或wget中使用SSPI进行HTTP代理身份验证的好方法。
但是,curl (the download tool) 支持支持SSPI,但仅限于某些版本。不幸的是,默认的cygwin构建不是其中之一。您可以通过获取详细版本信息来了解您的curl构建是否支持SSPI:
curl -v -V
如果支持SSPI,将在功能行中提及。
要获得支持SSPI的Windows版本,我必须转到http://curl.haxx.se/latest.cgi?curl=win32-ssl,然后将下载选项更改为 Windows,zip,启用SSL,启用SSPI(7.19.5)。当您阅读本文时,版本号可能已更改。
然后从命令行静默失败。当我从Windows资源管理器运行时,我收到一条消息,说明缺少libeay32.dll。从Windows获取此功能的一种方法是从openssl.org到windows version的唯一链接。该生产商要求捐赠以支付带宽成本。另一种方法是从源代码构建自己的。
毕竟卷曲使用以下命令行:
curl.exe -U : --proxy-ntlm --proxy myproxy.com:8080 http://www.google.com
-U :
不配置密码,其他命令行选项设置代理。您可能需要更改代理和端口设置。
如果只有cygwin的curl版本支持SSPI,这将更加容易。我现在要提出要求。
答案 1 :(得分:7)
请注意我的编辑包含有关-U和-u的不准确假设。我已提交更正,但在临时说明中:
curl -U = Authentication to a proxy
curl -u = Authentication to a server
因此,第一个命令应该是:
curl.exe -U : --proxy-ntlm --proxy myproxy.com:8080 http://www.google.com
和第二个,在透明NTLM的例子中:
curl -v -u : --ntlm [the redirection URL from Location: header]
对此感到抱歉!
答案 2 :(得分:2)
可能有点迟了但是想提到这一点。最初的问题是在用户已登录的Windows上一般性地询问NTLM代理身份验证而没有密码。毫无疑问,卷曲可以做到这一点,但我想提供另一种选择。
NTLMAps和Cntlm是将NTLM身份验证作为中间代理的代理。但是,它们都需要用户/通行证,因为它们主要针对Linux用户。我历史上曾在Windows上使用过这些工具,但对于必须向他们提供凭据的相同要求感到恼火。
因此,我创作了Px for Windows这是一个类似于上述两者的HTTP代理,但使用SSPI来管理公司代理所需的身份验证。您需要配置的只是代理服务器和端口。它有助于现有的无法通过NTLM代理进行通信的应用程序,例如pip和npm。
为了开发自己的应用程序,代码还应该有助于弄清楚如何在Python中执行此操作以及可能访问SSPI的语言。