【发布时间】:2012-12-01 22:45:21
【问题描述】:
这在某种程度上是一个推测性的问题,因为我所掌握的信息中的答案可能并不明显,但我希望有足够经验的人能够根据公司代理的常见做法识别出可能的答案。
我在公司代理背后工作(不是作为软件开发人员)。在业余时间,我正在玩弄我正在开发的 Java 程序。该程序需要发出一些非常简单的 HTTP GET 请求,为此我使用了 Apache HttpClient。起初我担心我是否会通过代理服务器。在我们的网络浏览器中,代理服务器很容易被输入到网络设置中……不需要身份验证。所以,我在我的 Java 程序中添加了以下内容:
myClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, MY_PROXY);
果然成功了!然而,我还有另一个顾虑。来自我的程序的 HTTP 请求可能指定了一些奇怪的用户代理(我已经确认是这种情况),我不希望它们在自动或手动数据包检查中引发任何怀疑。于是我对自己说,“为什么不直接把 User-Agent 头设置成和本机浏览器一样呢?”
myClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT, BROWSER_AGENT);
这就是奇怪的地方。如果上面的BROWSER_AGENT 字符串设置为完全与我机器上公司提供的浏览器(IE 或 FF)的值相同,我会收到“身份验证失败,缺少凭据”类型的错误消息返回从公司代理服务器。但是,如果我将 User-Agent 标头设置为通用标题,例如 Mozilla 5.0 甚至是完全伪造的字符串,甚至是 empty 字符串,一切正常!让我困惑的部分是:
- 当 User-Agent 设置为与我的浏览器相同(一个长而复杂的字符串)时,我以某种方式“身份验证失败”,这是没有意义的,因为在真正的浏览器中我不提供身份验证信息(除非它来自某个预先- 可能安装了证书?)
- 如果公司要求对发送到端口 80 上的代理服务器的任何请求进行身份验证,那么他们如何让随机的 User-Agent 字符串通过?监督?还有什么我无法理解的原因?
希望这个问题不会过于投机而不能被视为具有建设性。我很想听听有这方面经验的人的意见。谢谢。
【问题讨论】:
-
可能当它看到一些真实的浏览器时,它会尝试一些透明的身份验证,例如 ntlm。而且因为不是所有的软件都支持它,可能是你的系统管理员决定让所有不支持ntlm的请求通过。
标签: java proxy user-agent apache-httpclient-4.x apache-httpcomponents