我在C#(.exe输出)中创建了一个应用程序,该应用程序连接到需要自签名证书的API WebService。
为了进行调试,我已将证书添加到受信任的根证书颁发机构证书存储区,并且它一直运行良好。
从命令行控制台运行它,我也没有收到任何错误,(我想这是因为命令行还会检查证书是否存在。)
当应用程序从另一个进程运行时出现问题,然后出现以下错误。
“基础连接已关闭:无法为SSL / TLS安全通道建立信任关系。”
我的问题是:
我找到了解决方案。
System.Net.WebException thrown when consuming a web service over HTTPS
答案 0 :(得分:0)
你没有提到它,但是这个过程是作为另一个用户运行的吗?
除非您专门选择计算机帐户证书存储区,否则您将向个人证书存储区(您的用户帐户)添加证书。当作为另一个用户运行时,这些不可用。
要为所有用户提供证书,请将其添加到计算机证书存储区:
您也可以选择服务帐户,并根据需要选择需要访问证书的服务。
MSDN上的This文章涵盖了相同的步骤,并且有点冗长。
编辑:
将证书添加到计算机存储区需要提升权限。如果您没有将其捆绑在MSI安装程序中,我建议您编写一个单独的InstallCertificate.exe(控制台或Windows应用程序)来执行安装。
在Visual Studio中:
创建一个新的控制台/ Windows应用程序并添加一个Application Manifest文件(Add Item / 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提示,并且证书应该安装在计算机的根证书库中。