排查 Zscaler 相关问题(预览版)

本文提供 PAC CLI(Power Apps 命令行界面)pac code add-data-source 在 Zscaler 或类似 SSL 检查代理后反复失败时的疑难排除步骤。

Zscaler 是一个基于云的安全平台,它通过解密和重新加密 HTTPS 流量来执行安全套接字层/传输层安全性(SSL/TLS)检查。 它充当中间人(按设计)检查威胁的内容。 请参阅 Zscaler SSL 检查概述

症状

下表列出了可能指示 Zscaler 相关问题的症状。

症状 示例消息/模式
提取失败 TypeError: fetch failed / [AddDataSource.ServiceCall.GetConnector.Failure] ... fetch failed
空请求失败 Error: Request failed: {} (无正文)
TLS 握手/证书错误 UNABLE_TO_VERIFY_LEAF_SIGNATURE / SELF_SIGNED CERT IN CHAIN (如果调试已启用)
脱离企业网络环境操作 从 Zscaler 断开连接时命令成功

先决条件清单

开始前请确认以下事项:

  1. 已安装 最新的 Power Platform CLI 。 如果不确定,请对其进行更新。
  2. 您已向正确的环境进行身份验证。 使用 pac auth createpac auth list 命令。
  3. 安装 Node.js 版本大于或等于 v22。 旧版本具有更严格的不同信任行为。
  4. 您可读取用户证书存储库。 配置文件无锁定限制。
  5. 企业策略允许将 Zscaler 根 CA 添加至开发工具用户信任列表。

故障排除步骤

使用以下部分中的信息进行故障排除。

步骤 1:验证基线

请运行 pac env who 命令以消除与代理无关的原因。

如果此命令成功,则常规连接正常;故障与数据源调用隔离。

步骤 2:确认已安装 Zscaler

运行以下命令,确保存储中存在 Zscaler 证书。

Get-ChildItem Cert:\CurrentUser\Root |
    Where-Object { $_.Subject -like "*Zscaler*" } |
    Select-Object Subject, Thumbprint

若 Zscaler 注入其证书,您将看到 Zscaler 签发者而非 Microsoft。

注释

当 Zscaler 等代理截获 HTTPS 流量时,它会将原始服务器证书替换为由公司根 CA 签名的自己的证书。 这允许代理解密、检查和重新加密流量。 浏览器信任该证书,因企业根 CA 已安装在系统信任存储库中。 请参阅 HTTPS 拦截的工作原理

步骤 3:将 Zscaler 根 CA 导出到 PEM

运行以下命令,将 Zscaler 根证书颁发机构(CA)导出到隐私增强邮件(PEM)

$cert = Get-ChildItem Cert:\CurrentUser\Root |
    Where-Object { $_.Subject -like "*Zscaler*" } |
    Select-Object -First 1

$pem = @(
    '-----BEGIN CERTIFICATE-----'
    [System.Convert]::ToBase64String(
        $cert.RawData,
        [System.Base64FormattingOptions]::InsertLineBreaks
    )
    '-----END CERTIFICATE-----'
) -join "`n"

Set-Content -Path "$env:USERPROFILE\.zscaler-root-ca.pem" -Value $pem

结果: ~\.zscaler-root-ca.pem 已创建。

注意

保护 PEM 文件: 确保对导出的证书具有适当的文件权限。 如果恶意参与者可以替换此文件,则可以截获来自 Node.js 进程的 HTTPS 流量。 推荐强化措施(移除继承权限后授予只读权限):

icacls "$env:USERPROFILE\.zscaler-root-ca.pem" /inheritance:r /grant:r "$env:USERNAME:(R)"

如果删除继承与公司策略冲突或触发终端保护控件,请跳过 /inheritance:r 并仅授予明确的读取权限:

icacls "$env:USERPROFILE\.zscaler-root-ca.pem" /grant:r "$env:USERNAME:(R)"

Windows 证书存储和 PEM 格式

Get-ChildItem Cert:\CurrentUser\Root 命令通过 PowerShell 的证书提供程序访问 Windows 证书存储。 PEM 是证书的 Base64 编码格式。 转换是必需的,因为 Node.js 需要 PEM 格式,而 Windows 以 DER(可分辨编码规则)格式存储证书。 请参阅 PowerShell 证书提供程序PEM 格式 RFC

Windows icacls 命令

icacls (完整性控制访问控制列表)是用于管理文件权限的 Windows 命令行实用工具。 所使用的参数: /inheritance:r 删除继承的权限, /grant:r 将现有权限替换为指定用户的只读访问权限。 请参阅 icacls 文档

步骤 4:指示 Node.js 信任证书

运行以下脚本,指示 Node.js 信任证书。

[System.Environment]::SetEnvironmentVariable('NODE_EXTRA_CA_CERTS', "$env:USERPROFILE\.zscaler-root-ca.pem", 'User')

关闭 & 后重新打开终端/VS Code 以使变更生效。

注意

范围影响:NODE_EXTRA_CA_CERTS环境变量 会影响用户帐户运行的所有 Node.js 进程。 如果 PEM 文件被篡改,则每个 Node.js 应用程序都信任修改后的证书颁发机构,而不仅仅是 PAC CLI。 定期验证文件哈希并使其保持安全。

NODE_EXTRA_CA_CERTS环境变量

此 Node.js 环境变量指定了一个文件,该文件包含 Node.js内置列表(Mozilla 的 CA 捆绑包)以外的更受信任的证书颁发机构。 设置后,Node.js 信任由内置列表和指定文件中 CA 签名的证书。 请参阅 Node.js CLI 环境变量

验证修复

按照以下步骤验证修补程序是否已在步骤 3-4 中正确应用,然后再移动到步骤 5。

  1. 确认是否已创建 PEM 文件并在预期位置存在

     Test-Path "$env:USERPROFILE\.zscaler-root-ca.pem" # Expect True
    
  2. 验证是否已正确设置环境变量,并返回 PEM 文件的路径

    [System.Environment]::GetEnvironmentVariable(
        'NODE_EXTRA_CA_CERTS',
        'User'
    )
    
  3. 检查 PEM 文件是否包含有效内容,而不是为空或损坏

    Get-Content "$env:USERPROFILE\.zscaler-root-ca.pem" -TotalCount 2
    # First line should be: -----BEGIN CERTIFICATE-----
    

步骤 5:重新运行命令

再次尝试运行该命令。

pac code add-data-source -a <apiId> -c <connectionId> [-t <tableName>] [-d <dataset|siteUrl>]

预期连接器检索成功而非获取失败。

(避免)不安全的解决方法

应避免的最终最终测试是暂时禁用 TLS 验证。

此解决方法强制 Node.js 接受任何提供的证书,包括自签名证书或欺骗证书。 这将消除 HTTPS 的所有真实性和完整性保证。 它使会话暴露于中间人攻击(MITM攻击)、凭证窃取和内容篡改的风险。 请勿在临时性诊断会话之外使用。

警告

安全风险: 这会完全禁用当前会话中所有 Node.js HTTPS 连接的 SSL 证书验证。 任何具有网络访问权限的攻击者都可以执行 MITM 攻击。 将此解决方法仅用于一次性诊断,以证明证书信任是根本原因。 从不提交脚本;切勿在生产环境中使用;测试后立即取消设置。

$env:NODE_TLS_REJECT_UNAUTHORIZED = "0"

在测试后取消设置:

Remove-Item Env:\NODE_TLS_REJECT_UNAUTHORIZED

Validation

应用解决方案后,请重试命令。 验证连接器检索成功:

[AddDataSource.ServiceCall.GetConnector.Start] { apiId: 'shared_office365users' }
[AddDataSource.ServiceCall.GetConnector.Success] { apiId: 'shared_office365users' }

不使用:

[AddDataSource.ServiceCall.GetConnector.Failure] { apiId: 'shared_office365users', error: 'fetch failed' }

故障排除矩阵

如果在完成 故障排除步骤后仍遇到问题,请调查以下问题。

fetch failed 持续存在

重启终端后重新确认 NODE_EXTRA_CA_CERTS 设置;确保 PEM 证书非零字节。 运行 Validate 修补程序 中的命令以验证文件是否存在,并且环境变量已正确设置。

多个 Zscaler 证书

如果 Get-ChildItem Cert:\CurrentUser\Root | Where-Object { $_.Subject -like "*Zscaler*" } 返回多个证书,请标识根 CA(通常命名 Zscaler Root CA)。 修改 步骤 3 以按颁发者名称或指纹选择正确的步骤。

不同的代理产品

此方案适用于所有执行 SSL 检测的企业代理(如 Blue Coat、Forcepoint、Netskope等),但步骤 3 需在证书主题中搜索 *Zscaler*。 调整筛选器以匹配代理:

# For Blue Coat:
$cert = Get-ChildItem Cert:\CurrentUser\Root |
    Where-Object { $_.Subject -like "*Blue Coat*" } |
    Select-Object -First 1

# For Forcepoint:
$cert = Get-ChildItem Cert:\CurrentUser\Root |
    Where-Object { $_.Subject -like "*Forcepoint*" } |
    Select-Object -First 1

然后使用匹配的证书完成步骤 3-4。

仅在非 VPN 环境下工作

当命令仅使用外部 VPN 时,它表示网络级阻止,而不是证书信任问题。 企业拆分隧道 VPN 配置可能通过阻止 Node.js/CLI 工具的本地防火墙路由 Power Platform API 流量,或将限制性策略应用于非浏览器流量。

修复 NODE_EXTRA_CA_CERTS 方法在此处无济于事。 请您的网络与安全团队积极参与:

  • 允许列表 PAC CLI 流量至 *.powerplatform.com*.dynamics.com*.azure.net
  • 允许从开发人员工作站直接 HTTPS(端口 443)到Microsoft云服务
  • 配置分割隧道规则以绕过对受信任的 Microsoft 终结点的检查和筛选

分流隧道/允许列表配置指南

某些企业 VPN 仅直接路由一部分流量,同时强制其他目标通过检查网关。 Power Platform 终结点必须能够正常访问,不得进行阻止或遇到 SSL 拦截冲突。 参见 Microsoft 连接要求获取端点允许列表配置指南

SELF_SIGNED CERT IN CHAIN

证书链不完整。 导出完整的证书链(根 + 中间)或请求网络团队提供完整的根 CA 捆绑包。 部分代理要求同时信任根证书和中间证书。

注释

在使用 SSL 检查代理服务器(如 Zscaler)时,要注意以下几点,以保持设置的安全性和可靠性:

  • 如果 Zscaler 轮换证书,请重复导出。
  • 更改仅影响当前用户范围。 没有系统范围的风险。
  • 安全:添加信任;不会禁用验证。
  • 若策略限制证书导出,请使用专用开发机。

升级数据

如果本文中的步骤均无帮助,请在联系技术支持之前收集以下信息并为其提供:

  • PAC CLI 版本: pac --version
  • Node.js 版本: node --version
  • OS + shell(例如 Windows PowerShell 7/Windows CMD)
  • 完整命令执行(已清理)
  • 清理后的错误块(首次出现)
  • NODE_EXTRA_CA_CERTS 值 (PowerShell: [System.Environment]::GetEnvironmentVariable('NODE_EXTRA_CA_CERTS','User')
  • PEM 文件的状态和哈希(例如 Get-FileHash $env:USERPROFILE\.zscaler-root-ca.pem

Power Platform 连接要求
Node.js NODE_EXTRA_CA_CERTS 文档