在向远程Web服务器发出HTTPS请求时,我使用WebRequest,它建立与远程Web服务器的安全连接.在开发期间,我在服务器上使用自签名证书,并且WebRequest无法建立安全连接,因为证书无效,这是预期的行为.
我发现这个代码"远程"证书检查,通过SetCertificatePolicy()以下代码中的调用方法激活.
public static void SetCertificatePolicy()
{
ServicePointManager.ServerCertificateValidationCallback
+= RemoteCertificateValidate;
}
/// <summary>
/// Remotes the certificate validate.
/// </summary>
private static bool RemoteCertificateValidate(
object sender, X509Certificate cert,
X509Chain chain, SslPolicyErrors error)
{
// trust any certificate!!!
System.Console.WriteLine("Warning, trust any certificate");
return true;
}
Run Code Online (Sandbox Code Playgroud)
我想知道,如果可以对远程SSL证书进行特殊检查(例如使用上面的代码),那么我可以验证远程Web服务器使用的是有效的SSL证书,而不仅仅是任何有效的证书,而是一个我想要?例如,我想确保我正在与www.someplace.com网站交谈,证书发给ACME公司,指纹00:11:22:.....
这种情况的"最佳实践"方法是什么?
谢谢!
如果您真的希望将其归结为一个特定证书,则可以将证书数据(以DER格式)与byte[]in进行比较certificate.GetRawCertData().
您还可以使用GetCertHashString()和Subject输入certificate参数RemoteCertificateValidate来获取您所需的信息.主机名应该在证书的主题备用名称中,或者如果没有主题备选名称,则在主题(尊贵)名称的CN中.考虑到.NET格式化主题字符串的方式,这应该是你在那里找到的第一个CN =.
如果certificate是实例,您还将获得更多数据X509Certificate2.然后,您就可以得到SubjectName作为X500PrincipalName,也是Extensions(检查对象可选名称扩展).使用诸如BouncyCastle之类的工具来解析主题名称可能是有用的.
您可能还会获得有关您尝试联系的主机名的更多信息sender,具体取决于其运行时类型.