繁体   English   中英

HTTPS 通过 HTTP 代理

[英]HTTPS through HTTP proxy

我有一个像代理一样工作的服务,你可以通过它获取网页。 例如通过 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 客户端为这个服务编写 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?

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

openssl s_client -connect www.somesite:443

[观看 ssl 证书详细信息滚动]

获取 /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 请求。

我找到了解决办法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM