.Net 阻止 API Web 服务连接
本文关键字:服务 连接 Web API 阻止 Net | 更新日期: 2023-09-27 18:35:34
我在 C# 中创建了一个应用程序(.exe输出),该应用程序连接到需要自签名证书的 API Web 服务。
为了调试,我已将证书添加到受信任的根证书颁发机构证书存储中,并且它一直运行良好。
从命令行控制台运行它,我也没有收到任何错误,(我想这是因为命令行还会检查证书是否存在。
当应用程序从另一个进程运行时,问题就出现了,然后是我收到以下错误的时候。
"基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。"
我的问题是:
- 为什么我可以从命令行和自动化流程中毫无问题地运行它?
- 我应该怎么做才能让我的应用程序使用自签名证书?
我已经找到了解决方案。
System.Net.WebException 在通过 HTTPS 使用 Web 服务时引发
您没有提到它,但是该进程是否以其他用户身份运行?
除非专门选择计算机帐户证书存储,否则会将证书添加到个人证书存储(用户帐户)。以其他用户身份运行时,这些选项不可用。
若要使证书可供所有用户使用,请将其添加到计算机证书存储中:
- 启动 mmc.exe
- 按 Ctrl+M(添加/删除管理单元)
- 选择证书,单击添加
- 选择计算机帐户,单击完成
- 导入证书
还可以选择"服务帐户",然后选择需要访问证书的服务(如果需要)。
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 提示,并且证书应安装在计算机的根证书存储中。