sme*_*eeb 5 java ssl https proxy spring
Spring(Boot)在这里,虽然这根本不重要.我正在尝试了解有关HTTP/S代理如何工作的更多信息以及构建一个在我的机器上本地运行的代理.我编写(并注册)了一个servlet过滤器,用一个愚蠢的HTML消息替换HTTP响应的主体:
public class DummyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
String html = "<html><head><title>Awesome!</title></head><body>Proxy is working!</body></html>";
httpServletResponse.writer.write(html);
httpServletResponse.writer.flush();
return;
}
@Override
public void destroy() {
}
}
Run Code Online (Sandbox Code Playgroud)
然后我运行我的Spring应用程序,并将浏览器的代理设置更改为指向我的应用程序(localhost:8080).
我现在能够访问HTTP网站,看到我的虚拟消息(" 代理正在工作! ")作为HTML输出.成功!!!然而,我然后去了谷歌的主页,显然使用HTTPS,谷歌主页渲染得很好.
因此,我将浏览器更改为使用我的Spring应用程序代理SSL(再次localhost:8080),然后再次尝试.这次我去谷歌时,我的浏览器给了我一个错误,说明连接有问题.我认为这是因为我的愚蠢简单代理导致浏览器和需要SSL的网站(在本例中为Google)之间的SSL"握手"问题.
我知道在SSL上使用代理肯定是可能的,因为(至少)Charles Proxy可以配置为执行此操作.显然,Charles根据自己的根CA证书动态生成您尝试访问的站点的证书.Charles和SSL站点使用该站点的证书,浏览器和Charles之间的通信使用Charles的证书.
但是知道这并没有帮助我理解为什么我的简单代理首先在SSL-land中引起问题.我需要在代码中进行哪些更改才能使其与HTTPS的行为相同,与HTTP相同?
我想知道以下是否适合我:
*.example.com(任何点com)localhost:443https://example.com,浏览器会联系我的代理,代理服务于自签名证书(现在它信任),代理可以与example.com网站的实际证书进行通信.这或类似的东西会解决我的问题吗?
所指出的问题实际上是 HTTP/S 的基本问题。
当指示您的浏览器使用给定地址(localhost:8080 ) 的代理时,浏览器会导致对配置的“代理服务器”进行任何后续 HTTP 调用,指示该“代理”它应该代表调用者执行调用浏览器访问原始 URL。
在您的情况下,“代理”实际上正在返回一条预设消息,并且不会真正尝试连接到原始 URL。(至少您没有告诉您的“代理服务器”将做什么以联系最初的目标站点。)这将是代理基本功能的更重要的方面。
如果使用 HTTPS 连接到服务器,那么您如何使用浏览器配置代理连接就很重要。
可以使用到代理的普通 HTTP 连接,并且仍然请求代理使用 HTTPS 连接进行“外部”调用。(然而,这种配置并没有那么普遍,因为代理需要仔细处理重定向等。此外,它还会使使用 HTTPS 的一些好处失效(至少在从浏览器到代理的通信段上)。
您的浏览器配置很可能使用 HTTPS 连接到“代理”( localhost:8080 )。然后,浏览器尝试发送 HTTPS 请求,并在目标使用常规 HTTP“响应”时遇到错误。
将代理 servlet 配置为接受 HTTPS 调用将“修复”该问题。(从此,“更新”编辑中的步骤将“解决”错误。)但是,您不需要在本地主机上使用端口 443。任何端口都可以。如果您想同时提供 HTTP 和 HTTPS 代理,您是否需要分配两个端口(例如,您可以将 8080 用于 HTTP,将 8081 用于 HTTPS)。
只是为了 empacase:看到“代理正在工作”消息并不能证明有一个正在工作的代理。它只是证明您的浏览器确实与您的 servlet 通信。(由于不读取任何头信息,所以和直接调用URL localhost:8080没有什么区别。)
除了“联系”之外,工作代理还需要接受请求,分析传入的标头并根据标准做出反应(特别是执行请求的“外部”调用并返回结果)。(当然,你读过HTTP协议相关的RFC(例如RFC7230)?)
| 归档时间: |
|
| 查看次数: |
1527 次 |
| 最近记录: |