消除 Web 证书告警
消除 Web 证书告警
问题现象
默认配置下,访问 FortiGate 的 Web 管理页(GUI)面时,浏览器会弹出告警提示,这是由于 FortiGate 默认使用的是自签名证书,CA 为 FortiGate 自身,浏览器默认情况下只信任公网权威 CA 机构颁发的证书,所以自签名的证书会被浏览器认为是不被信任的证书。
重要
即使用户在管理 PC 信任了 FortiGate Web 管理页面证书对应的 CA,但由于该证书可能没有 SAN(Subject Alternative Name)字段(也可能是 SAN 属性中没有包含 FortiGate 的管理 IP 或域名),访问 FortiGate Web 管理页面时,浏览器依然会提示告警信息。

解决方法 1 - 使用 Fortinet_GUI_Server 证书
重要
该方法在 FortiOS 7.2.1 及以上版本支持。
下载 CA 证书
在 FortiGate 的“系统管理 → 设置”页面的“管理端口设置”部分中,确认“HTTPS 服务器证书”选择为“Fortinet_GUI_Server”证书(默认配置会选择此证书)。
重要
- 如果“HTTPS 服务器证书”选择的不是“Fortinet_GUI_Server”证书,请先选择“Fortinet_GUI_Server”证书后点击页面下方的“应用”按钮下发配置。
- 如果是 HA 环境,从所有 HA 成员下载的 CA 证书都是一样的,CA 证书名称均为第一次成为 HA 集群主设备的序列号。

config system global set admin-server-cert Fortinet_GUI_Server end点击“下载 HTTPS CA 证书”按钮,下载“Fortinet_GUI_Server”证书的 CA 证书,将 CA 证书保存在本地磁盘,该 CA 文件名称一般为“Fortinet_CA_SSL.cer”。

重要
- 当“Fortinet_GUI_Server”证书到期前 2 天时,FortiGate 会重新生成“Fortinet_GUI_Server”证书(客户端 PC 不需要重新下载并信任 Fortinet_CA_SSL)。
- 如果“Fortinet_CA_SSL”证书在 FortiGate 上过期并重新生成, Fortinet_GUI_Server 也会重新生成(客户端 PC 需要重新下载并信任新的 Fortinet_CA_SSL)。
导入和信任 CA 证书
Windows PC
双击下载的 CA 证书文件,在安全警告框中点击“打开”按钮。

在打开的证书界面点击“安装证书”按钮。

在弹出的“证书导入向导”中选择存储位置(“当前用户仅对此用户生效”,“本地计算机”对所有用户生效),点击下一步按钮。

“证书存储”选择“将所有的证书都放入下列存储 (P)”,点击“浏览”按钮,选择存储到“受信任的根证书颁发机构”中,点击“确定”按钮,随后点击“证书导入向导”的“下一步按钮”。

点击“完成”按钮,完成 CA 证书的导入向导。

随后可能会弹出如下的提示信息,点击“是 (Y)”按钮即可成功导入。


使用 Win + R 快捷键打开运行窗口,输入“certmgr.msc”,点击确定按钮。

在“受信任的根证书颁发机构”中可以看到以上导入的 CA 证书,证书的名称为设备的序列号。

macOS
双击下载的 CA 证书文件,会弹出“钥匙串访问”窗口(需要系统密码验证),进入“证书”选项页,双击 FortiGate 的 CA 证书(或右键点击该 CA 证书并选择“显示简介”)。

打开该 CA 证书后,展开“信任”选项卡,修改“安全套接字层 (SSL)”的选项为“始终信任”,然后关闭该窗口(关闭时需要系统密码验证)。

此时证书列表中该 CA 证书前的✖符号消失,变为➕。

iOS 与 iPad OS
请参考:https://support.apple.com/zh-cn/102390
Android
请参考:https://juejin.cn/s/安卓安装根证书
结果验证
再次使用 Chrome/Firefox 访问 FortiGate 的 Web 管理页面(需要清除该站点的 Cookie),不会再产生证书告警,浏览器显示“连接是安全的”。

实现原理
现在的主流浏览器在验证网站证书时,不仅会检查网站证书的 CA 证书是否受信任,也会检查网站证书的 SAN(Subject Alternative Name)字段是否包含访问该网站时使用的 IP 或域名。
使用其他非“Fortinet_GUI_Server”的内置证书(如 Fortinet_Factory)作为 Web 管理页面的证书时,即使用户在管理 PC 导入了对应的 CA 作为“受信任的根证书颁发机构”中的一员,但由于该证书没有 SAN 字段(如下图所示),访问 FortiGate Web 管理页面时,浏览器依然会提示告警信息。

当使用“Fortinet_GUI_Server”作为 Web 管理页面的证书,FortiGate 会自动将设备的所有管理 IP 添加到“Fortinet_GUI_Server”证书的 SAN(Subject Alternative Name)属性中(如下图所示),当管理 PC 导入了对应的 CA 作为“受信任的根证书颁发机构”中的一员,浏览器检查 Web 管理页面中的 SAN 包含页面 IP,就认为该证书是受信任的。
重要
只有开启了 HTTPS 访问的接口 IP 会被添加到“Fortinet_GUI_Server”证书的 SAN 属性中。当接口关闭 HTTPS 访问后,对应的 IP 也会从 SAN 字段中删除。

解决方法 2 - 导入第三方证书
通过其他证书颁发机构(CA)为 FortiGate 颁发证书,颁发的证书中的 SAN(Subject Alternative Name)字段必须包含 FortiGate 的管理 IP 或域名(颁发和导入过程请参考:系统管理 → 系统设置 → 证书管理章节)。
重要
如果 FortiGate 的管理 IP 或域名发生变化,则需要重新为 FortiGate 颁发包含对应 SAN 的证书。
重要
通过 CSR 的方式配置 SAN 时,注意 CSR 配置中请求的 SAN 的格式,如下举例:
域名:
DNS:www.fortinet.com.cnIP 地址:
IP:10.10.12.1在 FortiGate 的“系统管理 → 设置”页面的“管理端口设置”部分中,将“HTTPS 服务器证书”选择为上步导入的证书。
管理 PC 信任该证书所属的 CA(参考上述方法,如果 CA 为公网公认的权威 CA,则不需要手动信任)。
解决方法 3 - 使用 Let's Encrypt 颁发证书
重要
使用该方法有以下要求:
- FortiGate 必须有公网 IP 和对应的公网域名(或是在 Internet 设备上将公网 IP 映射到 FortiGate)。
- FortiGate 的公网接口必须面向 Internet 开放 TCP 80 和 443 端口,以便 FortiGate 能够侦听 ACME 更新请求。 该接口不能配置任何 VIP,也不能在端口 80 或 443 上进行端口转发。
- 颁发的证书中的 SAN(Subject Alternative Name)属性会自动填充 FortiGate 的 DNS 主机名,无法编辑,不能使用通配符,不能添加多个 SAN 字段。
- FortiGate 必须能够访问 acme-v02.api.letsencrypt.org, 这个域名是证书服务的提供商 Let‘s Encrypt 的地址(默认)。
- 此方法创建的 FortiGate 证书不需要管理 PC 将 CA 证书导入本地的“受信任的根证书颁发机构”。
- FortiGate 注册的域名需要在国内备案,否则可能出现注册过程被 ISP 或云运营商阻断的情况。
配置步骤
如下图所示,FortiGate 的管理域名为
ec2-52-81-108-164.cn-north-1.compute.amazonaws.com.cn(注意该域名必须在 Internet 的 DNS 服务器上可以解析)。现在使用浏览器访问时,会有“不安全”的标识。在 FortiGate 的“系统管理 → 设置”的“管理端口设置”中,点击“创建证书”按钮,在右侧弹出的“创建证书”窗口中,点击“使用 Let's Encrypt”,通过向导为 FortiGate 创建公有 CA 颁发的证书(该功能免费)。

在右侧弹出的“创建证书”窗口中,填写证书名称,“域”填写 FortiGate 的管理域名,填写 Email 信息,点击“创建”按钮。

在弹出的“设置 ACME”窗口中,选择“ACME 接口”为 FortiGate 的公网接口,点击“确认”按钮。

耐心等待证书配置完成。

Let's Encrypt 证书创建完成。
重要
如果创建失败,可以点击“ACME Log”检查创建过程中的报错信息。

证书的管理界面中除了生成了申请的“Fortinet_GUI_ACME”证书外,还有一张中间 CA 证书。

config vpn certificate ca edit "ACME_CA_Cert_1" set range global next end config vpn certificate local edit "Fortinet_GUI_ACME" set password ENC jWTgiiU41fD+Mi94XyBXAY2ZY2wc+syGDVfIAEXKYRSwX2s30XJuR4sPybF+SNgKrWKDSp4tBxWunSNTMAjloZxtYZY1ieXOPPWQqkLtrZHuPZbRWxTBzl8hJm4ZeYxnh5xcN0hLjX4PXELjgIcQWv9fDE2B8YyJPzZDeL5FgSYA+tlM9670nfzlO9CbGIpQXqRGHw== set comments "Renewed with ACME on Tue Mar 12 08:10:19 2024 (UTC)" set range global set enroll-protocol acme2 set acme-domain "ec2-52-81-108-164.cn-north-1.compute.amazonaws.com.cn" set acme-email "bbai@fortinet.com" next end在“系统管理 → 设置”页面的“管理端口设置”部分中,将“HTTPS 服务器证书”选择为 Let's Encrypt 创建的证书“Fortinet_GUI_ACME”。

config system global set admin-server-cert Fortinet_GUI_ACME end
结果验证
再次使用 Chrome/Firefox 访问 FortiGate 的 Web 管理页面(需要清除该站点的 Cookie),不会再产生证书告警,浏览器显示“连接是安全的”。

申请到的 Let's Encrypt 证书中的 SAN 字段包含 FortiGate 的管理域名,有效期为 90 天,到期时间 2 天前会自动续期。

相关调试 CLI
查看 FortiGate ACME 状态。
重要
ACME hallenge type 是根据 FortiGate 的当前配置自动选择的。 当端口 443 是可用状态(不被 GUI、SSL VPN、Portal 等使用)时,它更喜欢使用 tls-alpn-01 挑战,否则使用 TCP 端口 80 上的 http-01 挑战。 如果 GUI 在端口 80 上运行,并且在所选的接口上设置了 HTTP 访问权限,那么 http-01 挑战将由节点代理转发,否则 Apache 将直接监听端口 80,只监听 ACME。
FortiGate # get system acme status Listening on interfaces: port1 ACME certificates registered: 1 //注册的证书个数// ACME challenge type: http-01 //监听80端口// FortiGate # diagnose sys tcpsock | grep :80- 172.31.1.91:80->0.0.0.0:0->state=listen err=0 socktype=1 rma=0 wma=0 fma=0 tma=0 inode=59778 process=152/httpsd查看 ACME 申请记录日志。
FortiGate # diagnose sys acme status-full ec2-52-81-108-164.cn-north-1.compute.amazonaws.com.cn { "name": "ec2-52-81-108-164.cn-north-1.compute.amazonaws.com.cn", "finished": true, "notified": false, "last-run": "Tue, 12 Mar 2024 08:09:20 GMT", "valid-from": "Tue, 12 Mar 2024 07:10:09 GMT", "errors": 0, "last": { "status": 0, "detail": "The certificate for the managed domain has been renewed successfully and can be used (valid since Tue, 12 Mar 2024 07:10:09 GMT). A graceful server restart now is recommended.", "valid-from": "Tue, 12 Mar 2024 07:10:09 GMT" } ......重启与 Let's Encrypt 通信的 Apache 服务器。
FortiGate # diagnose sys acme restart
Let's Encrypt 申请域名失败举例
检查申请 Let's Encrypt 证书时页面打印的“ACME Log”。
Let's Encrypt 无法主动访问到 FortiGate 的 TCP 80 或 443 端口
例如使用位于内网的 FortiGate(也无无公网 IP 映射到 FortiGate),Let's Encrypt 访问不了其 TCP 80 或 443 端口,日志提示 Timeout during connect(likely firewall problem),通过抓包查看未有 Let's Encrypt acme-challenge 消息到达 FortiGate。
Let's Encrypt 有一个测试网站 https://letsdebug.net/ ,可以先对 FortiGate 进行检查。

FortiGate 的域名使用了未在国内备案的域名
例如,DDNS 域名使用 acme2.float-zone.com,由于 float-zone.com 未在国内备案,因此运营商可能会拦截对该域名的请求。FortiGate 的 ACME Log 显示 invalid response。
但 https://letsdebug.net/检测是正常的。

本地使用游览器主动访问 FortiGate ACME 日志中的域名被拦截。因此 ACME 日志显示 invalid response。

SSL VPN 证书
参考方法 2 或方法 3 导入设备证书,并在客户端信任对应的 CA 证书后,在“VPN → SSL VPN → SSL - VPN 设置”中选择该证书即可。

config vpn ssl settings
set servercert "Fortinet_GUI_ACME"
end