hea*_*y25 3 .net c# validation ssl certificate
也许你们中的一个可以帮助我回答我关于在 .NET 框架中验证证书的问题。不幸的是,我在互联网上的研究中只找到了对我的问题的肤浅答案,但没有确切的解释。
同时我知道我可以使用以下代码检查我的软件证书是否有效。
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
private bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
return policyErrors == SslPolicyErrors.None;
}
Run Code Online (Sandbox Code Playgroud)
但我现在想知道微软在这里到底在检查什么?框架执行了哪些检查以使结果为 SslPolicyErrors.None?
例如,根证书是否也在此处验证以及它来自哪里?如果是这样,如何?
在您看来,是否仍然有必要(或有用)将我自己的检查添加到这些检查中,而 .NET Framework 尚未进行这些检查?
这部分只是重复c# Validating an X509Certificate2: 我这样做对吗?,那里的简短回答是您免费获得的检查(没有自定义处理程序,或者在您的处理程序之前已经完成):
SslPolicyErrors.RemoteCertificateChainErrors设置)
SslPolicyErrors.RemoteCertificateNameMismatch设置)例如,根证书是否也在此处验证以及它来自哪里?
此处的证书验证使用与 Internet Explorer、Chrome、Edge、Outlook 等相同的根信任列表,在 Windows 中集中管理。(Firefox 使用不同的根信任列表,该列表仅由 Firefox 管理。)
依你的意见 ...
意见问题在 StackOverflow 上是题外话。
是否仍然有必要(或有用)向这些检查添加我自己的检查,而 .NET Framework 尚未进行这些检查?
那要看。
如果您正在联系您自己的一台服务器,并且您知道有关证书链的一些信息,则可以添加额外的检查。例如,您可能知道您的服务器使用 Let's Encrypt,并且您将来自https://letsencrypt.org/certificates/ 的“Let's Encrypt Authority X3”证书嵌入到您的应用程序中,然后您可以固定中间……您只需要当他们转移到新的中间体时,一定要做出反应。
private bool ValidateRemoteCertificate(
object sender,
X509Certificate cert,
X509Chain chain,
SslPolicyErrors policyErrors)
{
if (policyErrors != SslPolicyErrors.None)
{
return false;
}
if (chain.ChainElements.Count != 3)
{
return false;
}
byte[] foundCert = chain.ChainElements[1].Certificate.RawData;
return s_letsEncryptX3Direct.SequenceEqual(foundCert) ||
s_letsEncryptX3Cross.SequenceEqual(foundCert);
}
Run Code Online (Sandbox Code Playgroud)
如果您不打算执行额外的检查(或进行自定义日志记录等),那么最好不要注册回调,因为当没有注册回调时,内存和 CPU 的实现会更好一些。