gpt4 book ai didi

java - HTTP 代理在浏览器中正常工作,但不允许连接到 Java 中除 443 以外的任何端口

转载 作者:行者123 更新时间:2023-11-29 06:11:32 25 4
gpt4 key购买 nike

我遇到了一个我无法弄清楚的奇怪问题。在我的 Java 代码中使用代理来发出非 SSL 请求时,它总是会出错,通知我无法将 SSL 请求发送到指定端口(而我什至没有尝试发送任何 SSL 请求),但是在配置时使用相同的代理在我的 Firefox 浏览器中运行起来就像一个魅力,我可以正常浏览所有网站。请注意,使用相同的 Java 代码,我可以单独向 443 端口发送请求。但那是因为代理检测到请求是 SSL,所以它只允许它们通过 443 端口。

我无法选择使用 -Dhttp.proxyHost-Dhttps.proxyHost 选项,因为它们对 Socket 对象不起作用,我需要一个我无权访问的 Socks 代理。所以我选择使用 commons-httpclient-3.1.jar,并使用 ProxyClient 对象来获取套接字。

这是我用来获取套接字的代码:

// Proxy Client
ProxyClient client = new ProxyClient();
client.getHostConfiguration().setHost("google.com", 80);
client.getHostConfiguration().setProxy("corporate-proxy", 80);
ConnectResponse response = client.connect();
Socket socket = response.getSocket();
if (socket == null) {
System.err.println(response.getConnectMethod().getStatusLine());
}

这是我的 System.err.println() 语句打印的确切错误消息:

HTTP/1.1 502 代理错误(不允许指定的安全套接字层 (SSL) 端口。ISA 服务器未配置为允许来自此端口的 SSL 请求。大多数 Web 浏览器使用端口 443 进行 SSL 请求。)

请不要建议我使用 URLConnection,因为我不需要单独的 HTTP 请求代理。

我也曾尝试明确指定协议(protocol)为 http 但没有任何运气:

client.getHostConfiguration().setHost("google.com", 80, Protocol.getProtocol("http"));

关于如何配置此 ProxyClient 对象的任何建议,以便代理服务器不会将请求视为 SSL 请求?

谢谢。

更新

我似乎明白了 ISA 服务器认为我使用 SSL 的原因。实际上,语句 client.connect(); 创建了一个通过 HTTP CONNECT 方法连接到代理的套接字。 Java 文档说,即使 HTTP CONNECT 代理通常用于 HTTPS 隧道,返回的套接字也不会包装在 SSL 套接字中。

但是对于ISA来说,它仍然会把这种HTTP请求当成SSL请求。当它发现此 SSL 请求不在 443 上,而是在某个其他端口上时,它会立即拒绝它。

所以现在的问题是我如何调用 client.connect() 来发送 HTTP GET 或 HTTP HEAD 而不是 HTTP CONNECT..

最佳答案

抱歉,但我认为这是 ISA Server 的限制,而不是 ProxyClient 的问题。见文章here配置 ISA Server 以允许连接到 443 以外的其他端口。我认为 ISA Server 无法识别您的请求,因为它不在 HTTP 1.x 请求中。

关于java - HTTP 代理在浏览器中正常工作,但不允许连接到 Java 中除 443 以外的任何端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com