trust anchor for certification path not found android что делать
Android java.security.cert.CertPathValidatorException: Trust anchor for certification path not found
There are three hosts that an android app do the authentication and authorization. Final host is the REST API. For the first time using Oauth authentication and authorization process it works without issue.
But if user kills the app after login and accessing the services provided by REST API and then again open the app, this issue arise. In this time authentication and authorization process is not happening, only the REST API. It caused to java.security.cert.CertPathValidatorException but it was working during the first use (login and then use the app).
Can someone explains the scenario behind this exception and whats wrong with the app. This works if certification exceptions are ignored as bellow according to this SO answer.
I am using Okhttp 3 for the http requests. Any suggestion would help to solve the issue. And please let me know if I use above code snippet, is it a security violation? will it effect to the security of the app?
2 Answers 2
I am answering to this to give an idea about the scenario and solution as per the android developer site for others benefit. I have solved this using custom trust manager.
The problem was with the server certificate, it misses intermediate certificate authority. However with the first flow certificate path is completed somehow and result was successful certificate path validation.
There is a solution for this in android developer site. it suggest to use custom trust manager that trusts this server certificate or it suggest to server to include the intermediate CA in the server chain.
UPDATE: My problem was solved after intermediate certificate authority added to the certificate chain from the server side. It is the best solution, Bundling the certificate with the app requires app to be updated on certificate expiring or any other issues related with certificate management.
UPDATE:03/09/2017 Easiest way to load certificate file I found is use of raw resource.
where certfilename is the certificate file placed in resources/raw folder. Also okhttp’s sslSocketFactory(SSLSocketFactory sslSocketFactory) has been deprecated and suggested approach in the okhttp api doc can be used.
Also when getting the certificate from the server it is better to use openssl.
Because I used to grab that from firefox and faced situation where it was altered by the virus guard.
Trust Anchor не найден для подключения SSL для Android
Я пытаюсь подключиться к ящику IIS6 с помощью SSL-сертификата godaddy 256bit, и я получаю сообщение об ошибке:
Был попыткой определить, что может быть причиной этого, но заготовка пробелов прямо сейчас.
Вот как я соединяюсь:
Решение @Chrispix опасно! Доверяя всем сертификатам, кто-то может сделать человека в средней атаке! Просто отправьте ANY сертификат клиенту, и он примет его!
Добавьте свой сертификат (ы) в настраиваемый диспетчер доверия, как описано в этом сообщении: Доверяйте всем сертификатам, используя HttpClient через HTTPS
Также немного сложнее установить безопасное соединение с пользовательским сертификатом, оно принесет вам необходимую защиту шифрования ssl без опасности для человека в средней атаке!
В отличие от принятого ответа вам не нужен настраиваемый менеджер доверия, вам нужно исправить конфигурацию вашего сервера!
Я столкнулся с такой же проблемой при подключении к серверу Apache с неправильно установленным сертификатом dynadot / alphassl. Я подключаюсь с использованием HttpsUrlConnection (Java / Android), который метался –
Фактическая проблема – неправильная конфигурация сервера – протестируйте ее с помощью http://www.digicert.com/help/ или аналогичной, и она даже скажет вам решение:
Вы также можете проверить сертификат с помощью openssl:
Вероятно, вы увидите:
Verify return code: 21 (unable to verify the first certificate)
Цепочка сертификатов будет содержать только один элемент (ваш сертификат):
… но должен ссылаться на подписывающие органы в цепочке обратно на тот, которому доверяют Android (Verisign, GlobalSign и т. Д.):
Инструкции (и промежуточные сертификаты) для настройки вашего сервера обычно предоставляются органом, выдавшим ваш сертификат, например: http://www.alphassl.com/support/install-root-certificate.html
После установки промежуточных сертификатов, предоставленных моим эмитентом сертификатов, у меня теперь нет ошибок при подключении с помощью HttpsUrlConnection.
Вы можете доверять определенному сертификату во время выполнения.
Просто загрузите его с сервера, введите активы и загрузите, как это, используя ssl-utils-android :
В приведенном выше примере я использовал OkHttpClient но SSLContext можно использовать с любым клиентом на Java.
Если у вас есть вопросы, не стесняйтесь спросить. Я автор этой небольшой библиотеки.
Сообщение об ошибке, которое я получал, было похоже, но причина в том, что сертификат, подписанный самостоятельно, истек. Когда клиент openssl был предпринят попытка, он дал мне причину, которая была упущена, когда я проверял диалоговое окно сертификата от firefox.
Так что в общем случае, если сертификат находится в хранилище ключей и его «VALID», эта ошибка исчезнет.
Обновление по последней документации для Android (март 2017 года):
Когда вы получите этот тип ошибки:
Этот вопрос может быть одним из следующих:
Решение состоит в том, чтобы научить HttpsURLConnection доверять определенному набору ЦС. Как? Проверьте https://developer.android.com/training/articles/security-ssl.html#CommonProblems
Ex. 1. Root.crt 2. Inter.crt 3. myCrt.crt
В windows i выполняется копирование Inter.crt + Root.crt newCertificate.crt
(Здесь я проигнорировал myCrt.crt)
Затем я предоставил файл newCertificate.crt в код через входной поток. Работа выполнена.
Вот код, который я использую (на языке Scala):
И вот код подключения:
В принципе, я настраиваю доверие к своему пользовательскому сертификату. Если это не удастся, я отключу защиту. Это не самый лучший вариант, но единственный выбор, который я знаю со старыми и багги-телефонами.
Этот примерный код может быть легко переведен на Java.
Доверия не нашел для Android SSL-соединение
Я пытаюсь подключиться к коробке IIS6 под управлением GoDaddy 256bit SSL cert, и я получаю сообщение об ошибке:
пытался определить, что может быть причиной этого, но рисование пробелов прямо сейчас.
вот как я подключаю :
12 ответов:
решение @Chrispix опасно! доверие всем сертификатам позволяет кому-либо сделать человека в середине атаки! просто отправьте любой сертификат клиенту, и он его примет!
добавьте свой сертификат(ы) в пользовательский менеджер доверия, как описано в этом сообщении: доверяя всем сертификатам с помощью HttpClient через HTTPS
хотя это немного сложнее установить безопасное соединение с пользовательским сертификатом, это принесет вам разыскивается безопасность шифрования ssl без опасности человека в середине атаки!
вопреки принятому вами ответу не нужен пользовательский менеджер доверия, вам нужно исправить конфигурацию сервера!
фактическая проблема заключается в неправильной конфигурации сервера-проверьте его с помощью http://www.digicert.com/help/ или подобное, и он даже скажет вам решение:
«сертификат не подписан доверенным центром (проверка корневого хранилища Mozilla). Если вы купили сертификат у доверенного центра,вам, вероятно, просто нужно установить один или несколько промежуточных сертификатов. Обратитесь за помощью к поставщику сертификатов, чтобы сделать это для вашей серверной платформы.»
вы также можете проверить сертификат с openssl:
вы, вероятно, увидите:
Verify return code: 21 (unable to verify the first certificate)
цепочка сертификатов будет содержать только 1 элемент (сертификат):
. но следует ссылаться на подписывающие органы в цепочке обратно на тот, которому доверяет Android (Verisign, GlobalSign и т. д.):
инструкции (и промежуточные сертификаты) для настройки вашего сервера обычно предоставляются центром, выдавшим Ваш сертификат, например: http://www.alphassl.com/support/install-root-certificate.html
после установки промежуточных сертификатов, предоставленных моим эмитентом сертификатов, теперь у меня нет ошибок при подключении с помощью HttpsUrlConnection.
вы можете доверять конкретному сертификату во время выполнения.
Просто загрузите его с сервера, поместите в активы и загрузите так, используя ssl-utils-android:
В приведенном выше примере я использовал OkHttpClient но SSLContext может использоваться с любым клиентом в Java.
Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать. Я автор этой маленькой библиотеки.
обновление на основе последней документации Android (март 2017):
когда вы получаете ошибки такого типа:
проблема может быть одной из следующих:
решение состоит в том, чтобы научить HttpsURLConnection доверять определенному набору ЦС. Как? Пожалуйста, проверьте https://developer.android.com/training/articles/security-ssl.html#CommonProblems
другие, которые используют AsyncHTTPClient С com.loopj.android:android-async-http библиотека, пожалуйста, проверьте настройка AsyncHttpClient для использования HTTPS.
отвечая на очень старый пост. Но, возможно, это поможет какому-то новичку, и если не из вышеперечисленного получится.
объяснение: я знаю, что никто не хочет объяснения дерьма; скорее решение. Но в одном лайнере вы пытаетесь получить доступ к службе с вашего локального компьютера на удаленный компьютер, который не доверяет вашей машине. Вы запрашиваете необходимость получить доверие от удаленного сервера.
устранение: следующее решение предполагает, что у вас есть выполнены следующие условия
действия:
Откройте Android Studio. Нажмите в верхнем меню построить > создать подписанный APK. В следующем окне нажмите кнопку создать новый. В новом окне введите данные во все поля. Помню два поля пароля, которые я рекомендую, должны иметь один и тот же пароль; не используйте другой пароль; а также помните путь сохранения в самом верхнем поле путь к хранилищу ключей:. После ввода всего поля нажмите кнопку ОК.
Подписать Apk Файл
Почти Нет:
вся тяжелая работа сделана, теперь движение истины. Чтобы получить доступ к резервному копированию промежуточного сервера через прокси, вам нужно сделать некоторые настройки в ваших реальных тестовых устройствах Android.
Настройка прокси в устройстве Android:
Последняя Остановка:
помните, что мы создали подписанный файл apk в подписать APK файл. Теперь настало время установить этот файл APK.
надеюсь, что проблема может быть решена. Если нет, пожалуйста, оставьте мне комментарии.
сообщение об ошибке, которое я получал, было похоже, но причина заключалась в том, что самозаверяющий сертификат истек. Когда клиент openssl был предпринят, он дал мне причину, которая была упущена, когда я проверял диалоговое окно сертификата из firefox.
Итак, в общем случае, если сертификат находится в хранилище ключей и его «действительный», эта ошибка исчезнет.
Ex. 1. Корень.ЭЛТ 2. Между.ЭЛТ 3. myCrt.ЭЛТ
в windows я выполнил копия Интер.ЭЛТ + корень.ЭЛТ newCertificate.ЭЛТ
(здесь я проигнорировал myCrt.crt)
тогда я предоставил newCertificate.crt-файл в код через входной поток. Работа сделанный.
вот код, который я использую (на языке Scala):
В основном, я настраиваю доверие к своему пользовательскому сертификату. Если это не удается, то я отключаю безопасность. Это не лучший вариант, но единственный выбор, который я знаю со старыми и глючными телефонами.
этот пример кода, может быть легко переведен в Java.
в моем случае это происходило после обновления до Android 8.0. Самозаверяющий сертификат Android был настроен на доверие, используя алгоритм подписи SHA1withRSA. Переход на новый сертификат, используя алгоритм подписи SHA256withRSA, исправил проблему.
поэтому вы можете дважды проверить свои URL-адреса, прежде чем начать создавать свой собственный менеджер доверия (как я сделал).
Trust Anchor not found for Android SSL Connection
I am trying to connect to an IIS6 box running a godaddy 256bit SSL cert, and I am getting the error :
Been trying to determine what could be causing that, but drawing blanks right now.
Here is how I am connecting :
21 Answers 21
Contrary to the accepted answer you do not need a custom trust manager, you need to fix your server configuration!
«The certificate is not signed by a trusted authority (checking against Mozilla’s root store). If you bought the certificate from a trusted authority, you probably just need to install one or more Intermediate certificates. Contact your certificate provider for assistance doing this for your server platform.»
You can also check the certificate with openssl:
You’ll probably see:
Verify return code: 21 (unable to verify the first certificate)
and, earlier in the output:
The certificate chain will only contain 1 element (your certificate):
. but should reference the signing authorities in a chain back to one which is trusted by Android (Verisign, GlobalSign, etc):
Instructions (and the intermediate certificates) for configuring your server are usually provided by the authority that issued your certificate, for example: http://www.alphassl.com/support/install-root-certificate.html
After installing the intermediate certificates provided by my certificate issuer I now have no errors when connecting using HttpsUrlConnection.
The solution of @Chrispix is dangerous! Trusting all certificates allows anybody to do a man in the middle attack! Just send ANY certificate to the client and it will accept it!
Add your certificate(s) to a custom trust manager like described in this post: Trusting all certificates using HttpClient over HTTPS
Although it is a bit more complex to establish a secure connection with a custom certificate, it will bring you the wanted ssl encryption security without the danger of man in the middle attack!
You can trust particular certificate at runtime.
Just download it from server, put in assets and load like this using ssl-utils-android:
In the example above I used OkHttpClient but SSLContext can be used with any client in Java.
If you have any questions feel free to ask. I’m the author of this small library.
Update based on latest Android documentation (March 2017):
When you get this type of error:
the issue could be one of the following:
The solution is to teach HttpsURLConnection to trust a specific set of CAs. How? Please check https://developer.android.com/training/articles/security-ssl.html#CommonProblems
Others who are using AsyncHTTPClient from com.loopj.android:android-async-http library, please check Setup AsyncHttpClient to use HTTPS.
Full code are as below.
Replying to very old post. But maybe it will help some newbie and if non of the above works out.
Explanation: I know nobody wants explanation crap; rather the solution. But in one liner, you are trying to access a service from your local machine to a remote machine which does not trust your machine. You request need to gain the trust from remote server.
Solution: The following solution assumes that you have the following conditions met
Steps:
Open Android Studio. Click top menu Build > Generate Signed APK. In the next window click the Create new. button. In the new window, please input in data in all fields. Remember the two Password field i recommend should have the same password; don’t use different password; and also remember the save path at top most field Key store path:. After you input all the field click OK button.
Sign Apk File
Click the bottom two Signature Versions checkboxes and click Finish button.
Almost There:
All the hardwork is done, now the movement of truth. Inorder to access the Staging server backed-up by proxy, you need to make some setting in your real testing Android devices.
Proxy Setting in Android Device:
One Last Stop:
Remember we generated the signed apk file in Sign APK File section. Now is the time to install that APK file.
I hope the problem might be solved. If not please leave me a comments.
I am creating an android application which uses https for communication with the server. I am using retrofit and OkHttp for making requests. These works fine for standard http requests. The following are the steps that I followed.
Step 1 : Acquired the cert file from the server using the command
Step 2 : Converted the cert to a BKS format by using the following commands
It asked me for password and the file was successfully created.
Step 3 :
Create a OkHttpClient and use the same for making https requests
Step 4:
RestAdapter has to be created
Other failure attempts : Tried to install the certificate in my Xperia Z2 and it says the file was installed but when i run the app the same exception is thrown.
Error Log Here is the error log that I got on executing.
Pasted there so that it will be easy to read..
8 Answers 8
DISCLAIMER: this answer is from Jul 2015 and uses Retrofit and OkHttp from that time.
Check this link for more info on Retrofit v2 and this one for the current OkHttp methods.
Okay, I got it working using Android Developers guide.
Just as OP, I’m trying to use Retrofit and OkHttp to connect to a self-signed SSL-enabled server.
Here’s the code that got things working (I’ve removed the try/catch blocks):
As I can see, you already have a .cert file, which is the same, so try to use it.
PS: For those that read it in the future and only have a .pem file, according to this answer, you only need this to convert one to the other:
PS²: For those that don’t have any file at all, you can use the following command (bash) to extract the public key (aka certificate) from any server: