gpt4 book ai didi

java - 为什么我的 Java servlet 过滤器不能通过 HTTPS 工作?

转载 作者:搜寻专家 更新时间:2023-10-31 19:53:17 43 4
gpt4 key购买 nike

这里是 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() {
}
}

然后我运行我的 Spring 应用程序,并将浏览器的代理设置更改为指向我的应用程序 (localhost:8080)。

我现在可以访问 HTTP 网站并看到我的虚拟消息(“代理正在工作!”)作为 HTML 输出。成功!!!然而,我随后访问了显然使用 HTTPS 的 Google 主页,并且 Google 主页呈现得很好。

所以我更改了我的浏览器以也使用我的 Spring 应用程序来代理 SSL(同样,localhost:8080)并再次尝试。这次我去谷歌的时候,我的浏览器报错说连接有问题。我认为这是因为我的愚蠢简单的代理导致浏览器和需要 SSL 的站点(在本例中为 Google)之间的 SSL“握手”出现问题。

我知道通过 SSL 使用代理当然是可能的,因为(至少)Charles Proxy可以配置为执行此操作。显然,Charles 通过根据自己的根 CA 证书为您尝试访问的站点动态生成证书来运行。 Charles 和 SSL 站点使用站点的证书,浏览器和 Charles 之间的通信使用 Charles 的证书。

但知道这一点并不能帮助我理解为什么我的简单代理首先在 SSL 领域引起问题。 我需要对我的代码进行哪些更改才能使其在 HTTPS 中的行为与在 HTTP 中的行为相同?


更新

我想知道以下是否适合我:

  1. *.example.com(任何.com)创建一个自签名通配符证书
  2. 将我的 Sring 应用配置为使用此 wildcart 证书并从端口 443(默认为 HTTPS)提供 HTTPS
  3. 将浏览器的 SSL 代理设置配置为指向 localhost:443
  4. 将我的自签名通配符证书添加到浏览器的信任库
  5. 现在,当我转到 https://example.com 下的任何 URL 时,浏览器会连接到我的代理,代理会返回自签名证书(它现在信任它),并且代理可以与 example.com 站点的实际证书对话。

这个或类似的东西能解决我的问题吗?

最佳答案

指出的问题确实是 HTTP/S 基础问题。

当指示您的浏览器在给定地址 (localhost:8080) 使用代理时,浏览器会引起对配置的“代理服务器”的任何后续 HTTP 调用,指示此“代理”它应该代表调用浏览器执行对原始 URL 的调用。

在您的情况下,“代理”确实返回了一个固定消息,并没有真正尝试连接到原始 URL。 (至少你没有告诉你的“代理服务器”为了联系最初的目标站点将要做什么。)那将是代理基本功能的更重要的方面。

在使用 HTTPS 连接到服务器的情况下,重要的是您如何配置与浏览器的代理连接。

可以使用普通 HTTP 连接到代理,并仍然请求代理使用 HTTPS 连接进行“外部”调用。 (然而,这种配置并没有那么普遍,因为代理需要例如仔细处理重定向。此外,它首先会使使用 HTTPS 的一些 yield 无效(至少在从浏览器到代理的通信段上。)

很可能您的浏览器配置使用了到“代理”的 HTTPS 连接 (localhost:8080)。然后浏览器尝试 HTTPS 请求并在目标“响应”常规 HTTP 时遇到错误。

将您的代理 servlet 配置为接受 HTTPS 调用将“修复”该问题。 (由此,“更新”编辑中的步骤将“解决”错误。)但是,您不需要在本地主机上使用端口 443。任何端口都可以。如果您想同时提供 HTTP 和 HTTPS 代理,您是否需要分配两个端口(例如,您可以将 8080 用于 HTTP,将 8081 用于 HTTPS)。

只是强调一下:看到“代理正在工作”消息并不能证明代理正在工作。它只是证明您的浏览器确实与您的 servlet 对话。 (因为你没有读取任何头信息,这与直接调用 URL localhost:8080 没有区别。)

除了获得“联系”之外,工作代理还需要接收请求、分析传入的 header 并根据标准使用react(尤其是执行请求的“外部”调用并返回结果)。(当然,你看过HTTP协议(protocol)相关的RFC(如RFC7230)?)

关于java - 为什么我的 Java servlet 过滤器不能通过 HTTPS 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38220724/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com