当向远程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;
}
我想知道,如果可以对远程SSL证书进行特殊检查(例如使用上面的代码),那么我可以验证远程Web服务器是否使用有效的SSL证书,而不仅仅是任何有效的证书,但是正是我想要的那个?例如,我想确保我正在与www.someplace.com网站交谈,证书发给ACME公司,指纹00:11:22:.....
这种情况的“最佳实践”方法是什么?
谢谢!
答案 0 :(得分:8)
如果您真的希望将其归结为一个特定证书,您可以将证书数据(以DER格式)与byte[]
中的certificate.GetRawCertData()
进行比较。
您还可以对GetCertHashString()
中的Subject
参数使用certificate
和RemoteCertificateValidate
来获取您所获得的信息。主机名应该在证书的主题备用名称中,或者如果没有主题备选名称,则在主题(尊贵)名称的CN中。考虑到.NET格式化主题字符串的方式,这应该是你在那里找到的第一个CN =。
如果certificate
是X509Certificate2
的实例,您还会获得更多数据。然后,您就可以将SubjectName
作为X500PrincipalName
以及Extensions
(以检查主题备用名称扩展名)。使用诸如BouncyCastle之类的工具来解析主题名称可能是有用的。
您可能还会获得有关您尝试在sender
中联系的主机名的更多信息,具体取决于其运行时类型。