消除Web证书告警

问题现象

默认配置下,访问FortiGate的Web管理页(GUI)面时,浏览器会弹出告警提示,这是由于FortiGate默认使用的是自签名证书,CA为FortiGate自身,浏览器默认情况下只信任公网权威CA机构颁发的证书,所以自签名的证书会被浏览器认为是不被信任的证书。

即使用户在管理PC信任了FortiGate Web管理页面证书对应的CA,但由于该证书可能没有SAN(Subject Alternative Name)字段(也可能是SAN属性中没有包含FortiGate的管理IP或域名),访问FortiGate Web管理页面时,浏览器依然会提示告警信息。

image-20240312112448781

解决方法1-使用Fortinet_GUI_Server证书

该方法在FortiOS 7.2.1及以上版本支持。

下载CA证书

  1. 在FortiGate的“系统管理→设置”页面的“管理端口设置”部分中,确认“HTTPS服务器证书”选择为“Fortinet_GUI_Server”证书(默认配置会选择此证书)。

    • 如果“HTTPS服务器证书”选择的不是“Fortinet_GUI_Server”证书,请先选择“Fortinet_GUI_Server”证书后点击页面下方的“应用”按钮下发配置。
    • 如果是HA环境,从所有HA成员下载的CA证书都是一样的,CA证书名称均为第一次成为HA集群主设备的序列号。

    image-20240312113052640

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

    image-20240312113656307

    • 当“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

  1. 双击下载的CA证书文件,在安全警告框中点击“打开”按钮。

    image-20240312114321495

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

    image-20240312140422268

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

    image-20240312140611846

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

    image-20240312140849499

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

    image-20240312141552615

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

    image-20240312141715024

    image-20240312141746235

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

    image-20240312142105875

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

    image-20240312142406717

macOS

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

    image-20240312143401817

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

    image-20240312143431172

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

    image-20240312143735433

iOS与iPad OS

请参考:https://support.apple.com/zh-cn/102390

Android

请参考:https://juejin.cn/s/%E5%AE%89%E5%8D%93%E5%AE%89%E8%A3%85%E6%A0%B9%E8%AF%81%E4%B9%A6

结果验证

再次使用Chrome/Firefox访问FortiGate的Web管理页面(需要清除该站点的Cookie),不会再产生证书告警,浏览器显示“连接是安全的”。

image-20240312144206205

实现原理

  1. 现在的主流浏览器在验证网站证书时,不仅会检查网站证书的CA证书是否受信任,也会检查网站证书的SAN(Subject Alternative Name)字段是否包含访问该网站时使用的IP或域名。

  2. 使用其他非“Fortinet_GUI_Server”的内置证书(如Fortinet_Factory)作为Web管理页面的证书时,即使用户在管理PC导入了对应的CA作为“受信任的根证书颁发机构”中的一员,但由于该证书没有SAN字段(如下图所示),访问FortiGate Web管理页面时,浏览器依然会提示告警信息。

    image-20240312150841310

  3. 当使用“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字段中删除。

    image-20240312151226629

解决方法2-导入第三方证书

  1. 通过其他证书颁发机构(CA)为FortiGate颁发证书,颁发的证书中的SAN(Subject Alternative Name)字段必须包含FortiGate的管理IP或域名(颁发和导入过程请参考:系统管理→系统设置→证书管理章节)。

    如果FortiGate的管理IP或域名发生变化,则需要重新为FortiGate颁发包含对应SAN的证书。

  2. 在FortiGate的“系统管理→设置”页面的“管理端口设置”部分中,将“HTTPS服务器证书”选择为上步导入的证书。

  3. 管理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或云运营商阻断的情况。

配置步骤

  1. 如下图所示,FortiGate的管理域名为ec2-52-81-108-164.cn-north-1.compute.amazonaws.com.cn(注意该域名必须在Internet的DNS服务器上可以解析)。

  2. 现在使用浏览器访问时,会有“不安全”的标识。在FortiGate的“系统管理→设置”的“管理端口设置”中,点击“创建证书”按钮,在右侧弹出的“创建证书”窗口中,点击“使用Let's Encrypt”,通过向导为FortiGate创建公有CA颁发的证书(该功能免费)。

    image-20240312155527786

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

    image-20240312160103543

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

    image-20240312160244320

  5. 耐心等待证书配置完成。

    image-20240312161054060

  6. Let's Encrypt证书创建完成。

    如果创建失败,可以点击“ACME Log”检查创建过程中的报错信息。

    image-20240312161239244

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

    image-20240312161509808

    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
    
  8. 在“系统管理→设置”页面的“管理端口设置”部分中,将“HTTPS服务器证书”选择为Let's Encrypt创建的证书“Fortinet_GUI_ACME”。

    image-20240312161741112

    config system global 
        set admin-server-cert Fortinet_GUI_ACME
    end
    

结果验证

  1. 再次使用Chrome/Firefox访问FortiGate的Web管理页面(需要清除该站点的Cookie),不会再产生证书告警,浏览器显示“连接是安全的”。

    image-20240312163038521

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

    image-20240312162703490

相关调试CLI

  1. 查看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
    
  2. 查看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"
      }
    ......
    
  3. 重启与Let's Encrypt通信的Apache服务器。

    FortiGate # diagnose sys acme restart
    

Let's Encrypt申请域名失败举例

检查申请Let's Encrypt证书时页面打印的“ACME Log”。

Let's Encrypt无法主动访问到FortiGate的TCP 80或443端口

  1. 例如使用位于内网的FortiGate(也无无公网IP映射到FortiGate),Let's Encrypt访问不了其TCP 80或443端口,日志提示Timeout during connect(likely firewall problem),通过抓包查看未有Let's Encrypt acme-challenge消息到达FortiGate。

  2. Let's Encrypt有一个测试网站https://letsdebug.net/ ,可以先对FortiGate进行检查。

    image-20240312170719651

FortiGate的域名使用了未在国内备案的域名

  1. 例如,DDNS域名使用acme2.float-zone.com,由于float-zone.com未在国内备案,因此运营商可能会拦截对该域名的请求。FortiGate的ACME Log显示invalid response。

  2. https://letsdebug.net/ 检测是正常的。

    image-20240312171036798

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

    image-20240312171204004

SSL VPN证书

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

image-20240312180613930

config vpn ssl settings
    set servercert "Fortinet_GUI_ACME"
end

Copyright © 2024 Fortinet Inc. All rights reserved. Powered by Fortinet TAC Team.
📲扫描下方二维码分享此页面👇
该页面修订于: 2024-03-28 16:27:37

results matching ""

    No results matching ""