代码之家  ›  专栏  ›  技术社区  ›  Kevin Pang

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

  •  4
  • Kevin Pang  · 技术社区  · 16 年前

    我使用HttpWebRequest对象通过httppost访问web服务。部分要求是:

    1. 验证证书中的URL是否与我要发布到的URL匹配
    2. 验证证书是否尚未过期

    HttpWebRequest会自动为我处理吗?我假设,如果出现这些条件中的任何一个,我会得到标准的“无法为SSL/TLS安全通道建立信任关系”异常。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Samuel Liew cicero lopes    8 年前

    是的,HttpWebRequest会自动处理这些:

    1. 验证证书中的URL是否与要发布到的URL匹配
    2. 验证证书是否有效且可信
    3. 验证证书是否尚未过期

    你必须使用这样的代码 this 如果要禁用此功能。

        2
  •  0
  •   rook    16 年前

    不是真的。您仍然需要检查是否使用回调函数返回了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;
    }