Это правильное решение для исключения CERTIFICATE_VERIFY_FAILED? - PullRequest
0 голосов
/ 30 января 2019

Итак, я сейчас создаю приложение Xamarin.Android, и какое-то время оно использовало мой REST API, который я создал, для связи с данными взад и вперед.

Однако недавно я переключил свой сертификат SSLк LetsEncrypt, который вызвал следующее исключение при попытке связаться с моим API из моего приложения:

Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED

Что, как я предполагаю, означает, что он не был проверен правильно.Ниже я нашел следующий фрагмент, который проверяет запрос только с моего домена и проходит через него, и это работает.

Однако мой вопрос таков.Это безопасно?Может ли это привести к тому, что человек в середине атаки, или я в порядке?

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicy) =>
{
    if (sslPolicy == SslPolicyErrors.None)
        return true;

    if (sslPolicy == SslPolicyErrors.RemoteCertificateChainErrors &&
       ((HttpWebRequest)sender).RequestUri.Authority.Equals("MY_API_DOMAIN"))
        return true;

    return false;
};

1 Ответ

0 голосов
/ 30 января 2019

Ваш способ решить эту проблему определенно небезопасен: вы, по сути, принимаете произвольные сертификаты, если запрос относится к конкретному домену в URL.Это означает, что злоумышленник может просто перехватить весь трафик на этот конкретный сервер, предоставить вам свой поддельный сертификат и прослушать или даже изменить данные, не обращая внимания на ваше приложение.

Если ваш сервер работает без проблем сВ браузере более вероятно, что ваше приложение / система либо не доверяет Let's Encrypt CA, либо (что более вероятно) неправильно настроено на вашем сервере и не отправляет требуемый промежуточный сертификат.Пожалуйста, проверьте сервер на SSLLabs и найдите такие проблемы, как неполная цепочка .

...