HTTPS通过HTTP代理

时间:2016-03-24 14:34:40

标签: java http https apache-httpclient-4.x

我的服务就像代理一样,您可以通过它获取网页。例如通过telnet

GET http://example.com HTTP/1.1
Host: example.com

但如果我想下载https页面,我应该执行以下操作

GET https://example.com HTTP/1.1
Host: example.com
Https-Header: true

我想使用apache http client为这项服务编写scala客户端,使用像代理主机这样的服务。

private val DefaultProxy = new HttpHost("service host", port)
private val DefaultClient =
HttpClientBuilder.create().
  setProxy(DefaultProxy).
  build()

我可以成功下载http页面,但是当我尝试下载https页面时,apache客户端向代理发出CONNECT请求,并且它响应有错误,导致服务只能在GET请求下运行。 如何让apache客户端使用与http一样的https页面,这意味着向代理发送GET请求,而不是CONNECT?

2 个答案:

答案 0 :(得分:1)

要以与使用telnet的http网页相同的方式下载https网页,您需要先建立ssl / tls连接:

  

openssl s_client -connect www.somesite:443

     

[观看ssl证书详情滚动]

     

GET /index.html HTTP / 1.1

     

主持人:www.somesite

来自https://www.bearfruit.org/2008/04/17/telnet-for-testing-ssl-https-websites/

的示例

对于scala,也许可以帮助您:https://github.com/scalaj/scalaj-http

HTTPS是基于SSL / TLS的HTTP,因此您需要建立到网站的SSL / TLS安全隧道,然后您可以发送您的HTTP请求。

答案 1 :(得分:0)

我找到了解决方案。

我编写自定义HttpRoutePlanner,它始终提供不安全的路由,然后Apache客户端使用https链接,如http链接,有一个HttpRoutePlanner代码

private def routePlanner(proxy: HttpHost) = new HttpRoutePlanner() {

  def determineRoute(target: HttpHost ,
                     request: HttpRequest,
                     context: HttpContext) = {
    new HttpRoute(target, null,  proxy, false)
  }
}