0

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

谢谢

4

1 回答 1

1

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

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

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

于 2012-09-06T15:47:27.257 回答