HttpWebRequest是否自动处理证书验证?

时间:2010-05-04 20:16:23

标签: c# .net vb.net security certificate

我正在使用HttpWebRequest对象通过HTTP POST访问Web服务。部分要求是我:

  1. 验证证书中的URL是否与我发布到的网址
  2. 相匹配
  3. 验证证书是否有效且值得信任
  4. 验证证书是否已过期
  5. HttpWebRequest会自动为我处理吗?我假设如果出现这些条件中的任何一个,我会得到标准的“无法建立SSL / TLS安全通道的信任关系”异常。

2 个答案:

答案 0 :(得分:2)

是的,HttpWebRequest自动处理这些:

  1. 验证证书中的URL是否与您要发布到的网址
  2. 相匹配
  3. 验证证书是否有效且值得信任
  4. 验证证书是否已过期
  5. 如果要禁用此功能,则必须使用this之类的代码。

答案 1 :(得分:0)

不是真的。您仍然需要检查是否使用回调函数返回sslpolicyerror。确保针对url测试您的实现,例如使用自签名证书的https://rootkit.com/

    void InitPhase()
{
    // Override automatic validation of SSL server certificates.
    ServicePointManager.ServerCertificateValidationCallback =
           ValidateServerCertficate;
}
private static bool ValidateServerCertficate(
        object sender,
        X509Certificate cert,
        X509Chain chain,
        SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        // Good certificate.
        return true;
    }

    log.DebugFormat("SSL certificate error: {0}", sslPolicyErrors);

    bool certMatch = false; // Assume failure
    byte[] certHash = cert.GetCertHash();
    if (certHash.Length == apiCertHash.Length)
    {
        certMatch = true; // Now assume success.
        for (int idx = 0; idx < certHash.Length; idx++)
        {
            if (certHash[idx] != apiCertHash[idx])
            {
                certMatch = false; // No match
                break;
            }
        }
    }

    // Return true => allow unauthenticated server,
    //        false => disallow unauthenticated server.
    return certMatch;
}