如何手动信任我的应用程序中嵌入的自签名证书?

时间:2018-06-01 00:28:35

标签: c#

我在这里寻找一些指导。我在一个用C#编写的简单应用程序中嵌入了一个自签名SSL证书。我正在从ExecutingAssembly流中读取cert作为字节,然后将其添加到当前用户的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));
    }

1 个答案:

答案 0 :(得分:0)

您可以使用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,则证书有效,否则检查它是否有您的证书指纹。您显然可以查看更多信息,但这是通常检查特定证书的信息。