仍然无法在代理servlet中处理HTTPS请求



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

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

开发一个可以处理HTTPS连接的代理servlet

我将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请求,添加身份验证并转发到下一个代理服务器。

感谢

SSL代理不是这样工作的。如果您将HTTPS代理设置为localhost:8080,则浏览器将尽职尽责地连接到localhost:8080,并使用CONNECT谓词通过HTTP代理连接隧道传输SSL流量。如果不这样做,SSL就不会特别安全,任何代理服务器管理员都可以在下次有人决定从亚马逊购买东西、检查银行余额、注册定期支付成人娱乐网站或现在人们所做的任何需要SSL的事情时,琐碎地读取自己的信用卡详细信息。

你似乎没有告诉浏览器任何关于8443端口上的新SSL代理的信息,所以我不确定你为什么认为会使用它。不会的。您可以告诉浏览器使用基于SSL的代理服务器,也就是说,将代理设置为https://localhost:8443,但即使这样,它也将使用基于CONNECT的SSL隧道,因此除了更慢的连接之外,没有任何意义。

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

最新更新