在HTTPS请求期间验证远程SSL证书

时间:2010-06-23 12:08:15

标签: c# .net ssl https

当向远程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:.....

这种情况的“最佳实践”方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:8)

如果您真的希望将其归结为一个特定证书,您可以将证书数据(以DER格式)与byte[]中的certificate.GetRawCertData()进行比较。

您还可以对GetCertHashString()中的Subject参数使用certificateRemoteCertificateValidate来获取您所获得的信息。主机名应该在证书的主题备用名称中,或者如果没有主题备选名称,则在主题(尊贵)名称的CN中。考虑到.NET格式化主题字符串的方式,这应该是你在那里找到的第一个CN =。

如果certificateX509Certificate2的实例,您还会获得更多数据。然后,您就可以将SubjectName作为X500PrincipalName以及Extensions(以检查主题备用名称扩展名)。使用诸如BouncyCastle之类的工具来解析主题名称可能是有用的。

您可能还会获得有关您尝试在sender中联系的主机名的更多信息,具体取决于其运行时类型。

相关问题