【问题标题】:Still can not handle HTTPS request in proxy servlet仍然无法在代理 servlet 中处理 HTTPS 请求
【发布时间】:2012-08-31 10:26:09
【问题描述】:

我在Tomcat下开发了一个代理servlet,servlet接收客户端的请求并转发到另一个代理服务器,在转发之前,它会与代理服务器进行身份验证。现在它可以很好地处理 HTTP 请求但无法接收 HTTPS 请求。所以这个代理 servlet 并不完美。

我在这个论坛上搜索了谷歌并阅读了很多帖子,尤其是这个:

Developing a proxy servlet that can handle HTTPS connections

我配置Tomcat监听8443端口,如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
           keystoreFile="${user.home}/.keystore" keystorePass="changeit"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" redirectPort="8080"/>

我在 eclipse 中本地部署了 servlet,并将浏览器代理设置为 127.0.0.1:8080,但绕过它访问 localhost。

当我浏览 https://localhost:8443/ 时,我可以看到在 servlet 日志中收到的 https 请求(通过调用 request.getScheme() 和 request.isSecure())。但是如果我浏览https://www.google.com,它就无法连接,并且我的代理 servlet 没有捕获到请求。

我还重写了 service() 方法并打印了 request.getMethod(),但仍然未能捕获 HTTPS 请求。

我该怎么办?

我想要的只是获取 HTTPS 请求并添加身份验证并转发到下一个代理服务器。

谢谢

【问题讨论】:

  • 为什么要实施中间人攻击?
  • an 所以很明显这不起作用。如果您使用代理拦截并在中间切换证书,则无法验证 SSL 证书。这是一个安全限制。
  • 如果你只是想要一个代理服务器,你应该试试这个servletsuite.com/servlets/httpproxy.htm
  • 我们使用代理进行压缩,代理servlet用于进行身份验证和一些统计工作。
  • 我看到了你的链接,好像支持https请求。我会检查它,但不确定如何使用代理服务器进行身份验证。

标签: java tomcat servlets https


【解决方案1】:

这不是 SSL 代理的工作方式。如果您将 HTTPS 代理设置为 localhost:8080,那么您的浏览器将尽职尽责地连接到 localhost:8080 并使用 CONNECT 动词通过 HTTP 代理连接来隧道 SSL 流量。如果不这样做,SSL 将不会特别安全,并且任何代理服务器管理员都可以在下次有人决定从亚马逊购买东西或检查他们的银行余额或注册定期支付成人娱乐网站时轻松读取某人的信用卡详细信息或如今,无论人们做什么都需要 SSL。

您似乎没有告诉您的浏览器任何关于端口 8443 上的新 SSL 代理的任何信息,所以我不确定您为什么认为会使用它。它不会。您也许能够告诉您的浏览器使用基于 SSL 的代理服务器 - 即将您的代理设置为https://localhost:8443,但即便如此,它也会使用基于CONNECT 的 SSL 隧道,所以有除了仍然较慢的连接之外,真的没有任何意义。

如果您真正需要做的只是将此请求转发到另一个代理,则需要将 CONNECT 方法转发到上游代理并包含适当的身份验证信息。

【讨论】:

  • 我尝试在8080和8443上设置代理,都收不到CONNECT命令。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多