【问题标题】:How do I manually trust a self-signed certificate embedded in my application?如何手动信任嵌入在我的应用程序中的自签名证书?
【发布时间】:2018-06-01 00:28:34
【问题描述】:

我在这里寻求一些指导。我在一个用 C# 编写的简单应用程序中嵌入了一个自签名 SSL 证书。我正在将证书作为字节从 ExecutingAssembly 流中读取,然后将其添加到当前用户的 Store.Root 中。

下一步是验证整个 CA 链并使用布尔值作为 VerifcationCallback 委托的一部分。

问题是我认为向操作系统添加证书是不正确的。相反,我希望手动信任嵌入式证书,而不是将证书添加到计算机的受信任证书中。

应用程序嵌入证书与将证书添加到用户计算机的证书。

关于如何在 C# 应用程序中手动信任嵌入式证书有什么想法吗?

更新:Per mike z 我更新了我的代码并遇到了这个问题:Splunk 证书的指纹和 X509Certificate2 对象的指纹不匹配,不知道为什么。

public static bool CertificateVerificationCallback(System.Object o, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)

    {
        Cert = "~./Resources/splunk-VirtualBox.crt";
        Cert1 = X509Certificate.CreateFromCertFile(Cert);

        byte[] b = Cert1.GetRawCertData();

        X509Certificate2 Cert2 = new X509Certificate2();

        Cert2.Import(b);
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;
        }
        else if (certificate is X509Certificate2 cert2)
        {
            c1 = cert2.Thumbprint;
            c2 = Cert2.Thumbprint;

            return cert2.Thumbprint == Cert2.Thumbprint;

        }

        return false;
    }
public static void Main(string[] args)
    {
        ServicePointManager.ServerCertificateValidationCallback += CertificateVerificationCallback;
        Console.WriteLine(string.Format("cert2 {0}, Cert2{1}", c1, c2));
    }

【问题讨论】:

  • 简短回答,我认为你不能。你用证书做什么?如果您解释了您要达到的目标,也许有人实际上可以告诉您如何在不破坏证书信任链的情况下实现这一目标。
  • 虽然您可以设置自己的回调来处理证书验证,但我不知道为什么您仍然提出这样的问题。做任何你想做的事,当你可以这么明显的时候。

标签: c#


【解决方案1】:

您可以使用ServicePointManager.ServerCertificateValidationCallback 以编程方式接受证书:

ServicePointManager.ServerCertificateValidationCallback += (object o, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) =>
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;
    }
    else if (cert is X509Certificate2 cert2)
    {
        return cert2.Thumbprint == CertThumbprint;
    }

    return false;
};

关键是 .NET 框架已经运行了证书检查,如果返回 SslPolicyErrors.None 则证书有效,否则检查它是否有你的证书指纹。您显然可以检查更多信息,但这是通常检查特定证书的信息。

【讨论】:

  • 这就是我的选择,谢谢。每次我仍然得到一个错误。可能是我解码的方式。我正在将 ExecutingAssembly 流读入 X509Cert2 对象,然后将其指纹属性与服务器证书的指纹进行比较。由于某种原因,我的日志没有显示指纹匹配响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2016-12-23
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多