本文介绍如何将 HAProxy 配置为使用 LetsEncrypt 来自动管理证书,以确保 HAProxy 后面的Web服务器上的证书受到 SSL 安全保护。
在开始介绍之前,有一些要点必须要说明:
- 你必须有权管理 Web 服务器域名所在的DNS区域。
- LetsEncrypt 分发证书,必须证明你是域的所有者。有两种方法;一是让 LetsEncrypt 使用公开可用的 DNS 记录与 LetsEncrypt 客户端(本示例中为 HAProxy)通信,二是检查 DNS 区域内的记录,如果找到,将证明你有权访问管理该区域。本示例使用第二种方法。
基本操作流程: Internet 上的 Web 浏览器要访问网站。浏览器在 DNS 中找到的 IP 地址发送请求,HAProxy 将回答该请求。HAProxy 建立到内部 Web 服务器的连接,并成为浏览器和 Web 服务器之间的代理。
LetsEncrypt有两个阶段;与客户端( HAProxy)建立信任,并在旧证书即将到期时获取新证书和/或首先获取证书。信任阶段的工作方式如下:
- 请求 HAProxy 生成密钥并根据你的密钥将所需的身份信息发送给 LetsEncrypt。
- LetsEncrypt 为你创建一个帐户并回复验证信息。
- LetsEncrypt 要求你在所需的 DNS 区域中创建并填充新的 TXT 记录。
- 你创建 TXT 记录并要求 LetsEncrypt 对其进行验证。
- LetsEncrypt 验证 TXT 记录,现在知道你的帐户与指定域相关联。
下面开始配置步骤。
首先需要配置 LetsEncrypt。登录pfSense,安装“acme”插件:
安装完成后,转到“服务”、“Acme”,然后转到“帐户密钥”选项卡。
按照下面的格式填写相应信息,“ACME Server”选择为“Production”的,你也可以使用“Test”服务器。单击“创建新帐户密钥”、“注册 ACME 帐户密钥”,然后单击“保存”按钮。
单击“证书”选项卡。单击“添加”按钮。
按照下图格式填写信息。域名字段填写 FQDN,“方法”设置为“DNS-Manual”。也可以根据自己的DNS供应商情况选择合适的方法。后面还要将 DNS TXT 记录添加到域中。
完成后,单击“保存”按钮。
现在返回证书列表,点击“颁发(Issue)”按钮:
页面上会出现大量“绿色”字符的内容,如下所示:
从输出内容上,必须注意以下几点:
[Fri Jan 8 17:19:38 ACDT 2021] Add the following TXT record: [Fri Jan 8 17:19:38 ACDT 2021] Domain: ‘_acme-challenge.secure.agix.com.au’ [Fri Jan 8 17:19:38 ACDT 2021] TXT value: ‘lkjHJGfKUyFgJH78YUiJLHkgfRTfKUYJHiH’
这里显示的“TXT 值”,需要将其添加为相应域的新TXT DNS 记录。在本示例的cloudflare DNS主机上,添加的TXT记录如下:
现在返回到 LetsEncrypt 设置,单击“续订(Renew)”按钮,将得到一个新的证书。
可以设置计划任务让 LetsEncrypt 自动更新证书。在“General Settings”选项卡中,选中“Cron Entry”选项,单击“保存”按钮。
下面来设置HAProxy,进入pfSense,安装HAProxy插件。
转到“服务”、“HAProxy”并转到“设置”选项卡。
将“Max SSL …”的值设置为“2048”。然后点击“保存”按钮。
转到“后端”选项卡,参照下图进行设置。
注意:本示例内部 Web 服务器侦听端口为“5000”,但如果要进行端到端加密,服务器将会侦听端口“80”或“443”,本示例不讨论。
HAProxy 需要一种方法来确定内部 Web 服务器的状态(启动或关闭)。本示例已将其关闭,可以根据需要使用某一种方法。
单击“保存”和“应用更改”按钮。
转到“前端”选项卡,参照下图进行设置。
设置“默认后端”。将其设置为您之前创建的“后端”。
设置要使用的证书。
单击“保存”和“应用更改”按钮。
最后一步,添加规则允许流量通过防火墙。在防火墙的“WAN”接口选项卡上,添加规则确保设置的端口能从外部进行访问。
注意事项:
- 确保不要在 HAProxy 的同一端口/接口上运行 pfSense 强制门户。可以将访问pfSense的强制门户端口更改为“8443”之类的端口。
- 如果在使用证书时出错,可以随时重新“颁发”并重新“更新”。但建议先从pfSense的“证书”管理中删除它们。