【问题标题】:.Net Prevents API Web Service Connection.Net 阻止 API Web 服务连接
【发布时间】:2013-10-16 16:55:13
【问题描述】:

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

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

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

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

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

我的问题是:

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

我找到了解决办法。

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

【问题讨论】:

  • 你能给我们看一些代码吗?

标签: c# web-services authentication ssl certificate


【解决方案1】:

你没有提到它,但是进程是否以另一个用户身份运行?

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

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

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

您也可以选择服务帐户,并根据需要选择需要访问证书的服务。

This 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 提示,并且证书应该安装在您机器的根证书存储中。

【讨论】:

  • 是的!我认为你是对的,因为运行我的应用程序的进程被记录为另一个用户。那么,是否可以使用 .Net 为我的代码编写解决方案?
猜你喜欢
  • 2023-03-22
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多