c# - 如何手动信任嵌入在我的应用程序中的自签名证书?
问题描述
我在这里寻找一些指导。我在一个用 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));
}
解决方案
您可以使用以下方式以编程方式接受证书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 则证书有效,否则检查它是否具有您的证书指纹。您显然可以检查更多信息,但这是通常检查特定证书的信息。
推荐阅读
- vue.js - Microsoft 的 Graph API 请求产生不正确的标头
- html - 我们如何从 github 链接中知道 csv 的来源
- python - 使用铰链损失的 Mnist 数据集的鲁棒机器学习
- python - 使用卷积计算距离 numpy
- python - 异步运行 Azure Durable Function
- python - 为什么在 python 上的 if 语句中有 2 个等号
- laravel - 如何使用查询结果在 laravel 中查询更多内容?
- c++ - 是否可以在 C++ 中编写通用算术函数?
- javascript - 初始化组件后是否可以传递数据?
- c++ - doxygen:如何在类引用和文件引用中记录类成员函数