我使用带有 ACME 和 HAProxy 扩展的 pfSense 来管理和自动续订证书,并使用具有负载平衡功能的反向代理。在我的 ACME 模块中,我定义了要挑战的域,如下所示:
这意味着一旦我的证书更新,就会启动一个独立的 HTTP 服务器来监听端口 80。该服务器可以访问“众所周知的 acme 挑战”文件,并且我的证书将被验证。
现在我想在 pfSense 的反向代理(HAProxy 前端)中将所有 HTTP 流量重定向到 HTTPS。为此,我可以在 HAProxy 模块中设置一个新的前端,该前端在端口 80 上监听 WAN 地址,如果路径不是以如下方式开头,它将重定向/.well-known/acme-challenge/
:
因此,如果路径以 开头/.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 挑战时,我收到同样的错误。
[
如何使 ACME 独立 HTTP 服务器以及我的 HTTP 到 HTTPS 重定向共存且没有任何问题?
答案1
我不知道之前我做错了什么,但我重新尝试了一下,并设法让它以相同的思维方式工作。我创建了一个后端,它将是我的本地 Web 服务器:
我的 http/https 卸载器(前端)定义了一个路径规则,如果我们遇到 ACME 挑战,则会重定向到这样的后端:
可能是操作顺序的问题,也可能是命名的问题。我很有信心,我127.0.0.1
也测试过我之前的设置,但这似乎有效,我不知道为什么它以前不起作用。
现在使用 postman 确认配置正确非常容易。假设您有域名example.org
,您应该向两个不同的 URL 发出 GET 请求以验证其响应:
http://example.org/foobar
:应返回Location
带有https
URL 版本的标头,以确认卸载程序正常运行http://example.org/.well-known/acme-challenge/foobar
:應該超时!它不能立即返回错误,否则配置错误。如果配置正确,它将尝试与仅在 ACME 质询期间运行的独立 HTTP 服务器通信,因此它将在503 Service Unavailable
60 秒左右后超时,这意味着如果独立 HTTP 服务器正在运行,它将成功。
通过此设置,“独立 HTTP 服务器”方法将会起作用。