浏览器
DLG_FLAGS_INVALID_CA:IE 模式和兼容模式下证书不受信任
DLG_FLAGS_INVALID_CADLG_FLAGS_INVALID_CA 的意思是:Windows 不信任签发这张网站证书的机构。 这是 Internet Explorer、旧版 Edge 以及现在 Edge 的 IE 模式使用的代码,对应 Chrome 里的 NET::ERR_CERT_AUTHORITY_INVALID。证书可能是自签名的,可能是电脑不认识的公司内部 CA 签的,可能缺了中间证书,也可能链到了一个这台电脑根证书列表里没有的根。
现在还在哪里能看到它
这个代码如今主要出现在 Edge 的 IE 模式、内嵌 IE 引擎的业务软件和国内双核浏览器的兼容模式里。IE11 在大多数 Windows 版本上已于 2022 年 6 月 15 日停止支持,旧版 Edge 于 2021 年 3 月 9 日停止支持,仍会看到它的场景有三类:
- Edge 的 IE 模式用 IE11 的 Trident(MSHTML)引擎打开老网站,微软承诺 IE 模式至少支持到 2029 年。
- 企业内部的业务软件内嵌了 IE 引擎,或者用 WinINet 发起 HTTPS 请求。
- 国内的双核浏览器。 360 官方说明写明:国内主流浏览器都是双核,Webkit 内核用于常用网站,IE 内核主要用于部分网银、政府、办公系统;网站还可以用
<meta name="renderer" content="ie-comp">指定用 IE 兼容内核。这些系统一旦证书有问题,用户看到的就是 IE 风格的错误。
WinINet 文档里对应的错误是 ERROR_INTERNET_INVALID_CA(12045),含义是该函数不认识签发服务器证书的证书颁发机构。同一家族还有表示域名不匹配的 DLG_FLAGS_SEC_CERT_CN_INVALID 和表示日期问题的 DLG_FLAGS_SEC_CERT_DATE_INVALID。
常见原因(按出现频率排序)
内网系统用了自签名或内部 CA 证书,是这个报错最常见的原因;其余 3 种是缺中间证书、根证书列表过旧和 HTTPS 解密。
1. 内网系统用了自签名或内部 CA 证书
OA、ERP、财务系统和各种设备管理页面,经常用内部 CA 签发的证书,或者干脆自签名。没加入域的电脑、或者在根证书下发之前装好的电脑,都不信任它。在警告页的证书对话框里看签发者,或者执行:
openssl s_client -connect intranet.example.com:443 -servername intranet.example.com -showcerts </dev/null
最后一张证书的签发者是公司内部 CA,就说明这台电脑缺这个根证书。
2. 服务器没发中间证书
服务器只发了自己的证书。Windows 会尝试从证书里的 AIA 地址下载缺失的上级证书(certutil -urlfetch 测的就是这个过程),但在限制外网访问的内网里下载不到,于是出现“在家能开、在单位打不开”的现象。数一数上面命令输出了几张证书,详见 缺少中间证书。
3. 电脑的根证书列表过旧
Windows 通过微软的根证书自动更新机制按需下载受信任的根证书。管理员可以用 DisableRootAutoUpdate 策略关掉它,与外网隔离的网络也连不上更新服务器,于是较新的公共根证书这台电脑不认识,链到它们的网站证书都会失败。微软文档专门讲了断网环境下如何在内部服务器上托管根证书列表。
4. 代理或杀毒软件在做 HTTPS 解密
做 HTTPS 解密的设备会用自己的根证书重新签发每张网站证书。电脑上没有这个根证书,所有被解密的网站都会报错。看警告页上的签发者名称,详见 公司 SSL 解密。
访客能做什么
访客能做的是收集信息交给 IT:把网址和证书详情里的“颁发者”名称记下来,发给 IT 部门。再用普通 Edge 或 Chrome 打开同一个地址:也报警告,说明证书本身不受信任;只有 IE 模式报错,多半是服务器缺中间证书。不要因为某个网页或邮件让你装根证书就去装。
在 Windows 上排查
用 Windows 自带的 certutil -verify -urlfetch 能查出证书链断在哪一张证书。把服务器证书另存为文件(比如从警告页的证书对话框导出),让 Windows 自己构建证书链并尝试下载缺失部分:
certutil -verify -urlfetch server.cer
输出里的 CERT_E_UNTRUSTEDROOT(0x800B0109)表示证书链处理完了,但终止于一个不受信任的根证书,也就是缺根;CERT_E_CHAINING(0x800B010A)表示无法建立到受信任根的证书链,通常是中间证书找不到或下载不下来。
怎么修
修法分两类:服务器补全证书链,内部根证书用组策略下发到每台电脑。
服务器管理员(IIS): 把中间证书导入“本地计算机 > 中间证书颁发机构”,或者导入包含完整链的 PFX,然后在站点绑定里重新选择证书,见 IIS 安装 SSL 证书。其他服务器配置完整证书链文件。
内部 CA 根证书: 用组策略下发:计算机配置 > 策略 > Windows 设置 > 安全设置 > 公钥策略 > 受信任的根证书颁发机构 > 导入。单台电脑用 certlm.msc 导入“本地计算机”存储,不要导入“当前用户”。
断网环境: 按微软文档在内部服务器上托管受信任根证书列表,或者手动导入需要的公共根证书。
长期方案: 把系统迁出 IE 模式;如果它有公网域名,换成公共信任的证书。IE 模式虽然还在支持期内,但每次证书或 TLS 配置调整都要在两种引擎下各测一遍,维护成本只会越来越高。
怎么确认已经修好
修好后,证书链校验不再报错,IE 模式下打开也不再有警告。
常见问题
普通 Edge 能打开,切到 IE 模式就报 DLG_FLAGS_INVALID_CA,为什么?
新版 Edge 用自带的证书校验器和内置根证书库(同时也信任本机安装的根证书),IE 模式则通过 IE11 引擎走 Windows 自己的证书链构建。服务器漏发中间证书,或者某个根证书只有一边认识,就会出现一边正常一边报错。服务器发完整证书链,内部根证书装进 Windows 证书库。
可以点“继续浏览此网站(不推荐)”吗?
只对你自己管理的内部系统、而且地址确实是你预期的那个时才可以,最好先和管理员核对证书指纹。其他情况下,签发机构不受信任,你就无法确认对面是不是目标服务器。
已经装了公司的根证书,为什么还报错?
多半是装错了存储位置。根证书必须在“本地计算机”的“受信任的根证书颁发机构”里,才能对所有用户和服务生效;装到“当前用户”或者“个人”存储里不算信任锚。另外确认服务器发送了中间证书。
360、QQ 浏览器里会看到这个代码吗?
网站在双核浏览器的兼容模式(IE 内核)下打开时,用的是和 IE 相同的 Windows 组件,会出现 IE 风格的证书错误;在极速模式(Chromium 内核)下则显示 NET::ERR_CERT_AUTHORITY_INVALID 这类 Chrome 风格的代码。