.Net阻止API Web服务连接

时间:2013-10-16 16:55:14

标签: c# web-services authentication ssl certificate

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

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

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

当应用程序从另一个进程运行时出现问题,然后出现以下错误。

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

我的问题是:

  • 为什么我可以在没有任何问题的情况下从命令行和自动化过程中运行它?
  • 为了使我的申请使用自签名证书,我该怎么做?

我找到了解决方案。

System.Net.WebException thrown when consuming a web service over HTTPS

1 个答案:

答案 0 :(得分:0)

你没有提到它,但是这个过程是作为另一个用户运行的吗?

除非您专门选择计算机帐户证书存储区,否则您将向个人证书存储区(您的用户帐户)添加证书。当作为另一个用户运行时,这些不可用。

要为所有用户提供证书,请将其添加到计算机证书存储区:

  1. 启动mmc.exe
  2. 按CTRL + M(添加/删除管理单元)
  3. 选择“证书”,单击“添加”
  4. 选择“计算机帐户”,然后单击“完成”
  5. 导入您的证书
  6. 您也可以选择服务帐户,并根据需要选择需要访问证书的服务。

    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提示,并且证书应该安装在计算机的根证书库中。