0

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

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

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

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

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

我的问题是:

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

我找到了解决方案。

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

4

1 回答 1

0

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

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

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

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

于 2013-10-16T17:11:25.277 回答