当前位置: 首页 > 知识库问答 >
问题:

HttpRoutePlanner-它如何与HTTPS代理一起工作

龚彬
2023-03-14

我设置了一个HTTPS代理,这样HTTP客户端就可以安全地向代理发送普通HTTP请求。例如,客户机可以向代理发送加密的HTTP GET请求,代理将删除加密并将普通HTTP GET请求发送到终端站点。

我了解到这不是一个常见的设置,只有GoogleChrome具有内置功能来支持这样的场景。(信息在这里-http://wiki.squid-cache.org/Features/HTTPS#Encrypted_browser-Squid_connection)。我已经让GoogleChrome与我的HTTPS代理一起工作,因此代理方面没有麻烦。

我希望编写一个HTTP客户端,将所有请求加密到我的HTTPS代理。我尝试通过这种方式将HTTPS代理设置为DefaultHttpClient-

DefaultHttpClient dhc = new DefaultHttpClient();
HttpHost proxy = new HttpHost("192.168.2.3", 8181, "https"); //NOTE : https
dhc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

然后尝试执行任何请求会给我一个SSLPeerUnverifiedException。我不明白为什么。

在我探索DefaultHttpClient API的过程中,我遇到了HttpRoutePlanner和HttpRoute,通过它们我们可以指定是否应该加密与代理的连接。然而,我无法做到这一点。

这是一个图表,通过将其与HTTP代理设置区分开来解释我的设置-

HTTP代理:

HTTP Client <------- Plain Text GET, POST Requests -------> HTTP Proxy <------- Plain Text GET, POST Requests -------> HTTP End-Site

HTTP Client <------- Plain Text CONNECT Requests -------> HTTP Proxy <------- Plain Text CONNECT Requests -------> HTTPS End-Site

注意:对于HTTPS终端站点,代理只能看到连接请求。然后在客户端和终端站点之间建立SSL隧道

HTTPS代理:

HTTP Client <------- Encrypted GET, POST Requests -------> HTTPS Proxy <-------- Plain Text GET, POST Requests -------->  HTTP End-Site

HTTP Client <------- Encrypted CONNECT Requests -------> HTTPS Proxy <------- Plain Text CONNECT Requests -------> HTTPS End-Site

注意:对于HTTPS终端站点,只有初始连接请求应该加密到代理。随后的请求无论如何都将被隧道传输。

有谁能告诉我如何实现这个目标吗?我相信HttpRoutePlanner应该会有所帮助,但我不知道该怎么做。

共有2个答案

宰父桐
2023-03-14

Apache HttpClient 4。x仅通过连接隧道通过代理支持SSL。它不支持HTTPS代理。

穆华彩
2023-03-14

我能够制作ApacheHttpClient 4。x使用HTTPS代理。我在问题中提到的SSLPeerUnverifiedException被抛出,因为我不信任代理服务器的证书。一旦解决了这个问题,那么到HTTPS终端站点的连接就可以按预期工作。

对于与HTTP终端站点的连接,我必须使用我自己的HttpRoutePlanner才能使其工作。这是带有解释的代码-

DefaultHttpClient dhc = new DefaultHttpClient();
HttpHost proxy = new HttpHost("192.168.2.3", 8181, "https");
dhc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

SchemeSocketFactory factory = null;
try {
    factory = new SSLSocketFactory(new SimpleTrustStrategy()); //Trust All strategy
} catch (GeneralSecurityException e1) {
    e1.printStackTrace();
}
Scheme https = new Scheme("https", 443, factory);
dhc.getConnectionManager().getSchemeRegistry().register(https);

HttpGet request = new HttpGet("http://en.wikipedia.org/wiki/Main_Page");    

try {
    HttpHost host = determineTarget(request);

    if(host.getSchemeName().equalsIgnoreCase("http")){
        dhc.setRoutePlanner(new MyRoutePlanner());
    }

} catch (ClientProtocolException e1) {
    e1.printStackTrace();
}

下面是MyRoutePlanner的实现-

public class MyRoutePlanner implements HttpRoutePlanner {
    @Override
    public HttpRoute determineRoute(HttpHost target, HttpRequest request,
            HttpContext context) throws HttpException {
        return new HttpRoute(target, null
                , new HttpHost("192.168.2.3", 8181, "https")
                , true, TunnelType.PLAIN, LayerType.PLAIN); //Note: true
    }
}

为了让HttpClient通过HTTPS代理与HTTP终端站点进行对话,路由应该是安全的,但不应该有任何隧道或分层。

 类似资料:
  • 在windows server 2008 r2和IIS版本7.5中安装了SiteMinder Web代理(ca-wa-IIS7-12.0-sp3-cr010-win64.exe)。IIS服务器下有2个网站(A、B),而代理仅针对一个网站A(在安装过程中选择一个网站)。我没有有效的策略服务器,因此在配置Web代理时输入假IP。 然后在浏览器中访问A,如预期的那样出现错误,但在浏览器中访问B,服务器也

  • 问题内容: 我很难理解存储库模式。 关于该主题有很多意见,例如在Repository模式中做得正确,但其他信息,例如Repository是新的Singleton或再次,例如在Do n’t use DAO use Repository中, 或者只是以某种方式使用Spring JPA Data + Hibernate + MySQL + MAVEN 存储库似乎与DAO对象相同。 我厌倦了阅读这些东西,

  • 问题内容: 我正在设置信用卡处理程序,需要对CURL使用替代方法。当我使用测试服务器(未调用SSL URL)时,以下代码运行良好,但是现在当我在使用HTTPS的工作服务器上对其进行测试时,它失败,并显示错误消息“无法打开流”。 问题答案: 请尝试以下脚本,以查看您的php脚本是否有https包装器。 输出应该是这样的

  • Android 7对证书的处理方式进行了一些更改(http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html)不知怎么的,我不能让查尔斯的代理人再工作了。 我network_security_config.xml: 我正在调试模式下运行。但无论如何,我都会得到 不用说,我确实从

  • 我正在使用ssh-D创建套接字代理,想知道如何使用pip(或easy\u install)吗?我找到了这个问题,但那是一个http代理。 另外,请给我一个在OS X下工作的解决方案。(我尝试了proxifier,它可以与pip安装一起工作,但不能与sudo pip安装一起工作)

  • 问题内容: 我想使用standard从node.js发出传出HTTP调用。但是我无法直接从网络访问远程服务器,需要通过代理。 如何告诉node.js使用代理? 问题答案: 关于使用HTTP代理,Tim Macfarlane 的答案很接近。 使用HTTP代理(用于非安全请求)非常简单。您连接到代理并正常发出请求,只是路径部分包含完整的url,并且主机标头设置为您要连接的主机。 Tim与他的回答非常接