.Net 阻止 API Web 服务连接

本文关键字:服务 连接 Web API 阻止 Net | 更新日期: 2023-09-27 18:35:34

我在 C# 中创建了一个应用程序(.exe输出),该应用程序连接到需要自签名证书的 API Web 服务。

为了调试,我已将证书添加到受信任的根证书颁发机构证书存储中,并且它一直运行良好。

从命令行控制台运行它,我也没有收到任何错误,(我想这是因为命令行还会检查证书是否存在。

当应用程序从另一个进程运行时,问题就出现了,然后是我收到以下错误的时候。

"基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。"

我的问题是:

  • 为什么我可以从命令行和自动化流程中毫无问题地运行它?
  • 我应该怎么做才能让我的应用程序使用自签名证书?

我已经找到了解决方案。

System.Net.WebException 在通过 HTTPS 使用 Web 服务时引发

.Net 阻止 API Web 服务连接

您没有提到它,但是该进程是否以其他用户身份运行?

除非专门选择计算机帐户证书存储,否则会将证书添加到个人证书存储(用户帐户)。以其他用户身份运行时,这些选项不可用。

若要使证书可供所有用户使用,请将其添加到计算机证书存储中:

  1. 启动 mmc.exe
  2. 按 Ctrl+M(添加/删除管理单元)
  3. 选择证书,单击添加
  4. 选择计算机帐户,单击完成
  5. 导入证书

还可以选择"服务帐户",然后选择需要访问证书的服务(如果需要)。

MSDN 上的这篇文章介绍了相同的步骤,但更详细一些。

编辑:

将证书添加到计算机存储需要提升的权限。如果您没有将其捆绑在MSI安装程序中,我建议您编写一个单独的InstallCertificate.exe(控制台或Windows应用程序)来执行安装。

在 Visual Studio 中:

创建新的控制台/Windows 应用程序并添加应用程序清单文件(添加项/按 Ctrl+SHIFT+A)。在刚刚添加的 app.manifest 文件中,更改此行

 <requestedExecutionLevel level="asInvoker" uiAccess="false" />

进入这个

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

将此代码放在 Program.cs 中(在将其推送到生产环境之前添加一些日志记录和错误处理!

using System;
using System.Security.Cryptography.X509Certificates;
namespace InstallCertificate
{
    class Program
    {
        static void Main(string[] args)
        {
            string cerFileName = args[0];
            X509Certificate2 certificate = new X509Certificate2(cerFileName);
            X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadWrite);
            store.Add(certificate);
            store.Close();
        }
    }
}

运行应用程序。应收到 UAC 提示,并且证书应安装在计算机的根证书存储中。