Это правильное решение для исключения CERTIFICATE_VERIFY_FAILED?

Поэтому я сейчас создаю приложение 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 ответ

Решение

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

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

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

В случае конфигурации сервера вы должны поддерживать "прямую секретность". В противном случае вы получите указанную выше ошибку на некоторых устройствах Android, в то время как другие будут работать.

Надеюсь, это кому-то поможет.

Другие вопросы по тегам