HttpWebRequest автоматически заботится о проверке сертификата?

Я использую объект HttpWebRequest получить доступ к веб-сервису через POST HTTP. Часть требования то, что я:

  1. Проверьте, что URL в сертификате соответствует URL, на который я отправляю
  2. Проверьте, что сертификат действителен и доверяем
  3. Проверьте, что сертификат не истек

HttpWebRequest автоматически обрабатывает это для меня? Я предположил бы, что, если бы какое-либо из этих условий подошло, я добрался бы, стандарт "не мог бы установить доверительные отношения для исключения" безопасного канала SSL/TLS.

5
задан Kevin Pang 4 May 2010 в 20:16
поделиться

2 ответа

Да, HttpWebRequest автоматически обрабатывает их:

  1. Убедитесь, что URL-адрес в сертификате совпадает с URL-адресом, который вы отправляете
  2. Убедитесь, что сертификат действителен и является надежным
  3. Убедитесь, что срок действия сертификата не истек

Вы должны использовать код вроде это , если вы хотите отключить эту функцию.

3
ответ дан 15 December 2019 в 06:19
поделиться

Не совсем. Вам все равно нужно проверить, возвращается ли 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;
}
0
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: