Это правильное решение для исключения 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, в то время как другие будут работать.
Надеюсь, это кому-то поможет.