You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NUnit运行含titanium-web-proxy的单元测试时重复出现证书安全警告

解决NUnit测试中Titanium-Web-Proxy重复弹出证书安装警告的问题

我遇过不少类似的单元测试和代理证书冲突的场景,咱们先来理清楚问题根源:

单元测试每次运行时,NUnit会创建独立的进程隔离环境,测试结束后进程销毁,之前安装的证书可能在这个临时上下文里没被持久化;而独立应用是在同一个用户/进程上下文里运行,证书安装一次后就能被后续启动检测到,所以不会重复弹窗。

下面给你几个可行的解决方案,按优先级排序:

1. 提前安装证书到机器级存储区(推荐)

Titanium-Web-Proxy默认会把证书安装到当前用户的存储区,而单元测试进程可能无法共享这个存储区。你可以修改代码,强制将证书安装到本地机器存储区,这样所有进程都能检测到已安装的证书:

private readonly ProxyServer _proxyServer = new ProxyServer();

public void ProxyStart() {
    var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, 8000);
    // 配置证书安装到机器存储区
    _proxyServer.CertificateManager.InstallCertificateToMachineStore = true;
    // 确保根证书已安装(仅当不存在时才安装)
    _proxyServer.CertificateManager.EnsureRootCertificate();
    _proxyServer.AddEndPoint(explicitEndPoint);
    _proxyServer.Start();
}

第一次运行(不管是独立应用还是测试)会弹窗安装证书,之后所有测试运行都能检测到机器存储区里的证书,不会再弹窗。注意:这个操作需要管理员权限,所以运行测试时要确保NUnit Runner以管理员身份启动。

2. 在测试初始化时检查证书状态

如果不想修改代理核心代码,可以在测试类的[SetUp]方法里先检查证书是否存在,仅当不存在时才触发安装:

[SetUp]
public void TestSetup() {
    var certificateManager = new CertificateManager();
    // 检查根证书是否已安装到受信任根存储区
    if (!certificateManager.IsRootCertificateInstalled()) {
        // 仅在缺失时安装,避免重复弹窗
        certificateManager.EnsureRootCertificate();
    }
    // 启动代理
    ProxyStart();
}

这个方法能避免测试每次启动都尝试安装证书,只有证书缺失时才会弹窗。

3. 测试环境禁用自动证书安装(仅适用于无需HTTPS拦截的场景)

如果你的单元测试不需要拦截HTTPS请求,完全可以禁用Titanium-Web-Proxy的自动证书创建功能,从根源上消除弹窗:

_proxyServer.CertificateManager.DisableAutoCertificateCreation = true;

这样代理只会处理HTTP请求,不会尝试创建或安装根证书,自然也就不会有安全警告了。

4. 配置NUnit运行权限

有时候弹窗是因为NUnit Runner以普通用户权限运行,没有安装证书的权限,导致每次启动代理都尝试安装但失败,进而重复弹窗。解决方法很简单:右键点击NUnit Runner,选择以管理员身份运行,或者在Visual Studio里设置测试项目的运行权限为管理员。


内容的提问来源于stack exchange,提问作者Donsezan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:18:29