我在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请求并添加身份验证并转发到下一个代理服务器。
由于
答案 0 :(得分:1)
这不是SSL代理的工作方式。如果您将HTTPS代理设置为localhost:8080
,那么您的浏览器将尽职地连接到localhost:8080
并使用CONNECT
动词通过HTTP代理连接来隧道传输SSL流量。如果不这样做,SSL将不会特别安全,任何代理服务器管理员都可以在下次有人决定从亚马逊购买东西或查看他们的银行余额或注册定期付款的成人娱乐网站时,轻松读取一张信用卡详细信息。无论人们做了什么,这些都需要SSL。
您似乎没有告诉您的浏览器有关端口8443上的这个新SSL代理的任何信息,所以我不确定您认为它会被使用的原因。它不会。您可能能够告诉您的浏览器使用基于SSL的代理服务器 - 即将代理设置为https://localhost:8443
,但即使这样,它也会使用基于CONNECT
的SSL隧道,所以除了更慢的连接之外没有任何意义。
如果您真正需要做的是将此请求转发到另一个代理,则需要将CONNECT
方法转发到上游代理并包含相应的身份验证信息。