本文提供 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 断开连接时命令成功 |
先决条件清单
开始前请确认以下事项:
- 已安装 最新的 Power Platform CLI 。 如果不确定,请对其进行更新。
- 您已向正确的环境进行身份验证。 使用
pac auth create和pac auth list命令。 - 安装 Node.js 版本大于或等于 v22。 旧版本具有更严格的不同信任行为。
- 您可读取用户证书存储库。 配置文件无锁定限制。
- 企业策略允许将 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。
确认是否已创建 PEM 文件并在预期位置存在
Test-Path "$env:USERPROFILE\.zscaler-root-ca.pem" # Expect True验证是否已正确设置环境变量,并返回 PEM 文件的路径
[System.Environment]::GetEnvironmentVariable( 'NODE_EXTRA_CA_CERTS', 'User' )检查 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)