将 HTTP 重定向到 HTTPS,同时通过 pfSense 中的“独立 HTTP 服务器”方法(使用 ACME 和 HAProxy)允许 ACME 挑战?

将 HTTP 重定向到 HTTPS,同时通过 pfSense 中的“独立 HTTP 服务器”方法(使用 ACME 和 HAProxy)允许 ACME 挑战?

我使用带有 ACME 和 HAProxy 扩展的 pfSense 来管理和自动续订证书,并使用具有负载平衡功能的反向代理。在我的 ACME 模块中,我定义了要挑战的域,如下所示:

在我的域 SAN 列表中,我有一个启用的域,其方法类型为“独立 HTTP 服务器”。

这意味着一旦我的证书更新,就会启动一个独立的 HTTP 服务器来监听端口 80。该服务器可以访问“众所周知的 acme 挑战”文件,并且我的证书将被验证。

现在我想在 pfSense 的反向代理(HAProxy 前端)中将所有 HTTP 流量重定向到 HTTPS。为此,我可以在 HAProxy 模块中设置一个新的前端,该前端在端口 80 上监听 WAN 地址,如果路径不是以如下方式开头,它将重定向/.well-known/acme-challenge/

在访问控制列表 (ACL) 中,我定义了一个名为“acme”的规则,其表达式为“路径开头为”且值为 /.well-known/acme-challenge/。在操作表中,我将添加操作 http_request 重定向,子操作规则为:方案 https,条件为 acl 名称 !acme。

因此,如果路径以 开头/.well-known/acme-challenge/,则不会发生重定向,但如果不以 开头,则 HTTP 请求将使用 Location 标头响应所请求 URL 的 HTTPS 版本。到目前为止,ACL 调节有效,但我的问题是,当我请求 中的任何内容时,HAProxy 现在将返回“503 服务不可用 - 没有可用的服务器来处理此请求。” /.well-known/acme-challenge/

这很明显:HAProxy 开始监听 WAN 地址的 80 端口,所以我的独立 HTTP 服务器被它所跟踪。HAProxy 只能返回错误 503,因为它不知道 pfSense 本身会如何处理此类请求。

我认为我需要做的是设置一个后端,如果请求的路径以 开头/.well-known/acme-challenge/,我将请求发送到该后端,但是我必须如何在 HAProxy 中设置这样的后端,以便它可以与 ACME 模块的独立 HTTP 服务器一起工作?

我尝试127.0.0.1:80在端口 80 上添加后端以及主机的 IP。然后我在 HAProxy 的前端添加了另一个操作,并将条件 acl 名称添加acme到该后端,但我仍然收到错误 503,这不是因为我的独立服务器尚未运行。当我尝试使用 Let's Encrypt Staging Environment 运行 ACME 挑战时,我收到同样的错误。

[日志显示:正在验证;独立模式服务器;待处理,CA 正在处理您的订单,请稍候。(1/30);socat989891 E 写入(6,0x800add000,39):管道损坏 scat!209211 E 写入(6。0x800add000。126):管道损坏 .com:验证错误:...:来自 http://.../.well-known/acme-challenge/... 的响应无效

在一个示例中,我的默认 HAProxy Backend 在其服务器列表中有 192.168.0.1:80(LAN 中 PfSense 的 IP)。

ACME 请求到后端的重定向放在前端操作表的第一行。

如何使 ACME 独立 HTTP 服务器以及我的 HTTP 到 HTTPS 重定向共存且没有任何问题?

答案1

我不知道之前我做错了什么,但我重新尝试了一下,并设法让它以相同的思维方式工作。我创建了一个后端,它将是我的本地 Web 服务器:

- 打开 HAProxy/Backend 并添加一个名为 pfsense 的新后端条目,该条目转发到 127.0.0.1 端口 80

我的 http/https 卸载器(前端)定义了一个路径规则,如果我们遇到 ACME 挑战,则会重定向到这样的后端:

- 编辑您的前端,将其命名为 http 并由任何具有端口 80 的外部地址触发

- 在“访问控制列表”下添加一个名为 acme_challenge 的条目,其中包含表达式“路径以...开头:”,CS:no(不区分大小写),Not:no(不反转)和值 /.well-known/acme-challenge/

- 您现在需要两个操作,一个用于条件名称 !acme_challenge,另一个用于 acme_challenge。!acme_challenge 应使用规则方案 https 的操作“http-request redirect”来卸载,而 acme_challenge 应使用先前创建的本地后端 pfsense 的操作“使用后端”

可能是操作顺序的问题,也可能是命名的问题。我很有信心,我127.0.0.1也测试过我之前的设置,但这似乎有效,我不知道为什么它以前不起作用。

现在使用 postman 确认配置正确非常容易。假设您有域名example.org,您应该向两个不同的 URL 发出 GET 请求以验证其响应:

  • http://example.org/foobar:应返回Location带有httpsURL 版本的标头,以确认卸载程序正常运行
  • http://example.org/.well-known/acme-challenge/foobar應該超时!它不能立即返回错误,否则配置错误。如果配置正确,它将尝试与仅在 ACME 质询期间运行的独立 HTTP 服务器通信,因此它将在503 Service Unavailable60 秒左右后超时,这意味着如果独立 HTTP 服务器正在运行,它将成功。

通过此设置,“独立 HTTP 服务器”方法将会起作用。

相关内容