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

为何C# Windows Service不信任测试服务器的HTTPS连接?

问题原因

Windows服务默认运行的系统账户(比如Local System、Network Service)使用的是计算机级别的证书存储,而你之前导入自签名证书的是当前登录用户的个人证书存储。浏览器和桌面应用在当前用户上下文运行,能读取到用户存储里的证书,但服务账户看不到,所以触发信任验证错误。

解决方法

方法一:将证书导入计算机级别的受信任根存储(推荐)

这是测试环境长期使用的规范做法:

  1. 按下Win+R,输入mmc打开控制台
  2. 点击「文件」→「添加/删除管理单元」,选择「证书」后点击「添加」
  3. 在弹出窗口选择「计算机账户」,依次点击「下一步」→「完成」→「确定」
  4. 在控制台左侧展开「证书(本地计算机)」→「受信任的根证书颁发机构」→「证书」
  5. 右键「证书」→「所有任务」→「导入」,按向导完成自签名证书的导入

完成后,Windows服务的系统账户就能读取到该证书,信任验证会自动通过。

方法二:代码中临时跳过证书验证(仅限测试环境)

如果只是临时测试,可以添加证书验证回调强制信任所有证书(生产环境绝对禁止使用,会引发安全风险):
修改RequestHandler构造函数,加入以下代码:

public RequestHandler(String url)
{
    URL = url;
    Client = new WebClient();
    Client.Headers.Add(Constants.UserAgent, Constants.UserAgentValue);
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    
    // 仅限测试环境:跳过证书验证
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
}

方法三:修改Windows服务的运行账户

把服务的运行账户改成你当前登录的用户(该用户有权限访问你导入的证书):

  1. 打开「服务」控制台,找到你的Windows服务
  2. 右键点击「属性」→切换到「登录」选项卡
  3. 选择「此账户」,输入你的用户名和密码,点击「确定」
  4. 重启服务,此时服务会在你的用户上下文运行,能读取到你导入的证书
补充说明

你之前的误解在于:不同运行上下文的证书存储是相互隔离的。当前用户的证书存储只对该用户启动的程序可见,系统账户运行的程序需要读取计算机级别的存储,或者使用有对应权限的用户账户运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:26:27