公网 IP 是防火墙,内网里的所有服务全部共用一个 SSL 通配符证书的安装方法

场景说明

架构:防火墙拥有公网 IP,内网多台服务,全部共用一张通配符 SSL 证书(*.example.com)思路:证书只部署在防火墙,防火墙做 SSL 卸载(终止 HTTPS),再反向代理到内网各服务;内网服务可以只用 HTTP,不用装证书。 域名示例:a.example.com、b.example.com、c.example.com,证书*.example.com

⚠️前提:

  1. 域名*.example.com解析全部指向防火墙公网 IP

  2. 防火墙支持 SSL 卸载 + 基于 Host 的反向代理(SNI),主流:深信服、H3C、华为、pfSense、OPNsense、NGINX、Traefik 都可以

  3. 通配符证书必须包含*.example.com,且私钥完整(证书文件 + 私钥,不要分开丢失私钥)

一、证书准备(通用)

拿到证书一般 3 个文件:

  1. 证书公钥:*.example.com.crt(服务器证书)

  2. 证书私钥:*.example.com.key(重点!不能泄露)

  3. 中间证书 / CA 链:ca.crt(证书链,很多设备需要拼接)

部分防火墙要求证书 + 中间证书合并成一个 pem

# linux下合并证书链(顺序:服务器证书在前,中间证书在后)
cat *.example.com.crt ca.crt > fullchain.pem

最终上传到防火墙的一般是:fullchain.pem + private.key

二、防火墙配置核心逻辑(SNI + 反向代理)

  1. 在防火墙【SSL 证书管理】导入通配符证书(fullchain + 私钥),命名:wildcard-example

  2. 新建公网 HTTPS 监听:端口 443,绑定刚才导入的通配符证书,开启 SNI(必须开,否则无法区分域名)

  3. 配置基于 Host 域名的反向代理规则:

    • 访问 a.example.com:443 → 解密 SSL → HTTP 转发内网 192.168.1.10:80

    • 访问 b.example.com:443 → 解密 SSL → HTTP 转发内网 192.168.1.11:80

    • 访问 c.example.com:443 → 解密 SSL → HTTP 转发内网 192.168.1.12:80

  4. 可选:公网 80 端口监听,配置 HTTP 自动跳转到 HTTPS

  5. 防火墙放行策略:公网 → 防火墙 443 端口;防火墙到内网服务器放行 80,内网服务器不需要开放公网

数据流: 用户 HTTPS 请求 → 防火墙 (公网 IP) → 防火墙用通配符证书完成 SSL 握手解密 → 内网 HTTP 明文访问业务 → 返回,防火墙再加密 HTTPS 给用户

三、不同设备简要操作

方案 A:防火墙内置 NGINX(软防火墙 / OPNsense/pfSense)

导入证书到系统证书库,然后写代理配置示例:

server {
    listen 443 ssl;
    server_name *.example.com;
    ssl_certificate /etc/ssl/fullchain.pem;
    ssl_certificate_key /etc/ssl/private.key;

    # 根据域名转发内网
    if ($host = a.example.com) {
        proxy_pass http://192.168.1.10:80;
    }
    if ($host = b.example.com) {
        proxy_pass http://192.168.1.11:80;
    }
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
# http跳转
server {
    listen 80;
    server_name *.example.com;
    return 301 https://$host$request_uri;
}

方案 B:华为 / 华三 / 深信服等硬件防火墙(SSL 卸载 + 虚拟服务器 / 应用交付)

  1. 对象管理→SSL 证书:上传证书 + 私钥 + CA 链,启用

  2. 新建虚拟服务器,端口 443,开启SSL 卸载,选择上面的通配符证书,打开 SNI

  3. 配置域名匹配策略:

    • Host=a.example,后端服务器 192.168.1.10

    • Host=b.example,后端服务器 192.168.1.11

  4. 安全策略:允许外网访问该虚拟服务 443

注意:部分老硬件防火墙SNI 支持差,如果不支持 SNI,这种多域名共用一张证书方案会失效。

四、两种备选架构(区分:SSL 卸载 vs SSL 透传)

上面是【SSL 卸载(推荐)】:防火墙解密,内网 http,内网机器不用管证书。

不推荐:SSL 透传(防火墙只做端口映射,不处理证书)

防火墙直接 443 端口映射到内网一台机器,证书要部署在内网服务器,这种不能多内网服务共用同一张证书,只能一台机器。👉 不符合你的需求,不要选。

五、常见坑点

  1. ❗必须开启 SNI:浏览器携带访问域名,防火墙才能匹配不同后端;关闭 SNI,无法区分a/b域名。

  2. 证书域名匹配:通配符*.example.com不能匹配xxx.a.example.com(仅一级子域名)。

  3. 证书链不全:部分浏览器报不安全,就是缺少中间 CA 证书,一定要合并 fullchain。

  4. Host 头丢失:反向代理必须传递Host头,很多内网业务依赖 Host 识别域名,否则页面异常、跳转错误。

  5. 内网服务不要强制 HTTPS:防火墙已经卸载 SSL,如果内网服务强制 HTTPS,会变成防火墙解密后再发起 HTTPS,变成双层 SSL,配置更复杂。

  6. 源 IP 问题:内网日志看到的是防火墙内网地址,需要开启X-Real-IP传递真实客户端 IP。

六、测试验证

  1. 浏览器访问 https://a.example.com,查看证书,确认是*.example.com

  2. 访问 https://b.example.com,同一张证书,业务正常

  3. 在线 ssl 检测工具(sslshopper)检查证书链、SNI 是否正常

补充:如果内网业务必须保留 HTTPS(双层 SSL)

防火墙依然用通配符证书对外做 SSL;防火墙和内网之间走 HTTPS,内网服务器单独配置自签证书。一般没必要,增加性能开销。