C# 如何用C验证SSL证书#
也许你们中的一位可以帮助我回答关于在.NET框架中验证证书的问题。不幸的是,我在互联网上的研究中发现,我的问题只有肤浅的答案,但没有确切的解释 同时我知道我可以用下面的代码检查我的软件是否有有效的证书C# 如何用C验证SSL证书#,c#,.net,validation,ssl,certificate,C#,.net,Validation,Ssl,Certificate,也许你们中的一位可以帮助我回答关于在.NET框架中验证证书的问题。不幸的是,我在互联网上的研究中发现,我的问题只有肤浅的答案,但没有确切的解释 同时我知道我可以用下面的代码检查我的软件是否有有效的证书 ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; private bool ValidateRemoteCertificate(object sender, X509Cert
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
private bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
return policyErrors == SslPolicyErrors.None;
}
但我现在想知道微软到底在检查什么?框架执行了哪些检查以使结果SslPolicyErrors.None
例如,根证书是否也在此处验证?它来自何处?如果是,怎么做
在您看来,是否仍有必要(或有用)在这些检查中添加我自己的检查,而.NET Framework尚未执行这些检查?这只是部分重复,这里的简短回答是,您可以免费获得这些检查(没有自定义处理程序,或在处理程序之前已经完成):
- 证书链有效(否则
已设置)SslPolicyErrors.RemoteCertificateChainErrors
- 证书链接到受信任的根颁发机构
- 证书未过期(或将来到期)
- 该证书表示打算用作TLS服务器证书
- 如果对请求启用了吊销(默认为关闭),则不会吊销链中的任何证书
- 证书应用于您连接到的主机名(否则
已设置)SslPolicyErrors.RemoteCertificateNameMismatch
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);
}
如果您不打算执行额外的检查(或进行自定义日志记录等),那么最好不要注册回调,因为在没有注册回调的情况下,内存和CPU的实现会更好。只需检查链状态即可。已存在描述性消息:
[Test]
public async Task CheckWhatError()
{
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = ValidateRemoteCertificate;
var client = new HttpClient(handler);
try
{
using (var msg = new HttpRequestMessage(HttpMethod.Get, "https://expired.badssl.com/"))
{
using (var response = await client.SendAsync(msg))
{
// do stuff with the response
}
}
}
catch (Exception ex)
{
throw;
}
}
private bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
if(policyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
{
foreach(var cs in chain.ChainStatus)
{
Console.WriteLine(cs.StatusInformation);//validation errors here
}
}
return policyErrors == SslPolicyErrors.None;
}
非常感谢,你帮了我很多忙。