Я пытаюсь установить HTTPS-соединения, используя HttpClient
lib, но проблема в том, что, поскольку сертификат не подписан признанным центром сертификации (CA), таким как Verisign , GlobalSIgn и т. Д., Перечисленным в наборе доверенных сертификатов Android, Я продолжаю получать javax.net.ssl.SSLException: Not trusted server certificate
.
Я видел решения, в которых вы просто принимаете все сертификаты, но что, если я хочу спросить пользователя?
Я хочу получить диалог, похожий на диалог браузера, позволяющий пользователю принять решение, продолжать или нет. Желательно, чтобы я использовал тот же магазин сертификатов, что и браузер. Любые идеи?
Ответы:
Первое, что вам нужно сделать, это установить уровень проверки. Таких уровней не так уж много:
Хотя метод setHostnameVerifier () устарел для новой библиотеки apache, но для версии в Android SDK это нормально. И поэтому мы берем
ALLOW_ALL_HOSTNAME_VERIFIER
и устанавливаем его в фабрике методовSSLSocketFactory.setHostnameVerifier()
.Далее вам нужно установить нашу фабрику для протокола на https. Для этого просто вызовите
SchemeRegistry.register()
метод.Тогда вам нужно создать
DefaultHttpClient
сSingleClientConnManager
. Также в приведенном ниже коде вы можете видеть, что по умолчанию также будет использоваться наш флаг (ALLOW_ALL_HOSTNAME_VERIFIER
) по методуHttpsURLConnection.setDefaultHostnameVerifier()
Ниже код работает для меня:
источник
org.apache.http.conn.ssl.SSLSocketFactory
почему я хочу использоватьjavax.net.ssl.HttpsURLConnection
??Следующие основные шаги необходимы для обеспечения защищенного соединения от центров сертификации, которые не считаются доверенными для платформы Android.
По просьбе многих пользователей, я отразил самые важные части из моей статьи в блоге здесь:
java.net.ssl.HttpsURLConnection
(проще для понимания, более производительным)Хватай сертификаты
Вы должны получить все сертификаты, которые формируют цепочку от сертификата конечной точки до самого корневого центра сертификации. Это означает любые (если имеются) промежуточные сертификаты CA, а также сертификат корневого CA. Вам не нужно получать сертификат конечной точки.
Создать хранилище ключей
Загрузите BouncyCastle Provider и сохраните его в известном месте. Также убедитесь, что вы можете вызвать команду keytool (обычно находится в папке bin вашей установки JRE).
Теперь импортируйте полученные сертификаты (не импортируйте сертификат конечной точки) в отформатированное хранилище ключей BouncyCastle.
Я не проверял это, но я думаю, что порядок импорта сертификатов важен. Это означает, что сначала нужно импортировать самый нижний сертификат промежуточного ЦС, а затем весь путь до сертификата корневого ЦС.
С помощью следующей команды будет создано новое хранилище ключей (если оно еще не существует) с паролем mysecret и будет импортирован сертификат промежуточного ЦС. Я также определил поставщика BouncyCastle, где его можно найти в моей файловой системе и в формате хранилища ключей. Выполните эту команду для каждого сертификата в цепочке.
Проверьте, правильно ли были импортированы сертификаты в хранилище ключей:
Должен выводить всю цепочку:
Теперь вы можете скопировать хранилище ключей как необработанный ресурс в ваше приложение для Android под
res/raw/
Используйте хранилище ключей в вашем приложении
Прежде всего мы должны создать пользовательский Apache HttpClient, который использует наше хранилище ключей для соединений HTTPS:
Мы создали наш собственный HttpClient, теперь мы можем использовать его для безопасных соединений. Например, когда мы делаем вызов GET для ресурса REST:
Это оно ;)
источник
/res/raw/mykeystore.bks
, хотя и не смог разрешить ссылку на него. как это решить?Если у вас есть собственный / самозаверяющий сертификат на сервере, которого нет на устройстве, вы можете использовать приведенный ниже класс, чтобы загрузить его и использовать его на стороне клиента в Android:
Поместите
*.crt
файл сертификата/res/raw
так, чтобы он был доступен изR.raw.*
Используйте ниже класс, чтобы получить
HTTPClient
илиHttpsURLConnection
которого будет фабрика сокетов, использующая этот сертификат:Ключевые моменты:
Certificate
объекты генерируются из.crt
файлов.KeyStore
создано.keyStore.setCertificateEntry("ca", cert)
добавляет сертификат в хранилище ключей под псевдонимом "ca". Вы модифицируете код, чтобы добавить больше сертификатов (промежуточный CA и т. Д.).SSLSocketFactory
который затем может быть использованHTTPClient
илиHttpsURLConnection
.SSLSocketFactory
можно настроить далее, например, чтобы пропустить проверку имени хоста и т. д.Более подробная информация по адресу: http://developer.android.com/training/articles/security-ssl.html
источник
.crt
файлы? Скачать с сервера?Я был разочарован, пытаясь подключить мое Android-приложение к моей службе RESTful, используя https. Также меня немного раздражали все ответы, которые предлагали вообще отключить проверку сертификатов. Если вы это сделаете, какой смысл https?
После гугле на эту тему на некоторое время, я , наконец , нашел это решение , в котором внешние банки не нужны, только для Android API. Спасибо Эндрю Смиту, который разместил его в июле 2014 года
Это хорошо сработало для моего приложения-макета.
источник
import java.security.cert.X509Certificate;
Лучший ответ не сработал для меня. После некоторого расследования я нашел необходимую информацию о «Android Developer»: https://developer.android.com/training/articles/security-ssl.html#SelfSigned
Создание пустой реализации X509TrustManager сделало свое дело:
Помните, что эта пустая реализация TustManager является лишь примером, и ее использование в продуктивной среде может создать серьезную угрозу безопасности!
источник
Google рекомендует использовать Android Volley для соединений HTTP / HTTPS , поскольку это
HttpClient
устарело. Итак, вы знаете правильный выбор :).А также, НИКОГДА NUKE SSL-сертификаты (НИКОГДА !!!).
Использование ядерных сертификатов SSL полностью противоречит цели SSL, которая способствует безопасности . Нет смысла использовать SSL, если вы планируете бомбить все SSL-сертификаты. Лучшим решением было бы, если бы не использование SSL, или лучшим решением было бы создание
TrustManager
в вашем приложении + с использованием Android Volley для соединений HTTP / HTTPS.Вот Gist, который я создал с помощью обычного LoginApp, выполняющего HTTPS-соединения с использованием самоподписанного сертификата на стороне сервера, принятого в приложении.
Вот еще один Gist, который может помочь для создания самоподписанных сертификатов SSL для настройки на вашем сервере, а также для использования сертификата в вашем приложении. Очень важно: вы должны скопировать файл .crt, сгенерированный приведенным выше сценарием, в каталог «raw» из вашего проекта Android.
источник
Вот как вы можете добавить дополнительные сертификаты в хранилище ключей, чтобы избежать этой проблемы: Доверие всем сертификатам с использованием HttpClient через HTTPS
Он не будет запрашивать пользователя, как вы спрашиваете, но уменьшит вероятность того, что пользователь столкнется с ошибкой «Сертификат недоверенного сервера».
источник
Самый простой способ создания SSL-сертификата
Откройте Firefox (я полагаю, это также возможно с Chrome, но мне легче с FF)
Посетите ваш сайт разработки с самозаверяющим сертификатом SSL.
Нажмите на сертификат (рядом с названием сайта)
Нажмите на «Больше информации»
Нажмите на «Просмотреть сертификат»
Нажмите на «Детали»
Нажмите на «Экспорт ...»
Выберите «Сертификат X.509 с цепочкой (PEM)», выберите папку и имя, чтобы сохранить его, и нажмите «Сохранить».
Перейдите в командную строку, в каталог, в который вы скачали pem-файл, и выполните «openssl x509 -inform PEM -outform DM -in .pem -out .crt»
Скопируйте файл .crt в корень папки / sdcard на устройстве Android. Внутри устройства Android выберите Настройки> Безопасность> Установить из хранилища.
Он должен обнаружить сертификат и позволить вам добавить его на устройство. Найдите свой сайт разработки.
В первый раз он должен попросить вас подтвердить исключение безопасности. Вот и все.
Сертификат должен работать с любым браузером, установленным на вашем Android (Браузер, Chrome, Opera, Dolphin ...)
Помните, что если вы обслуживаете ваши статические файлы из другого домена (мы все суки скорости страницы), вам также необходимо добавить сертификат для этого домена.
источник
Я написал небольшую библиотеку ssl-utils-android, чтобы доверять определенному сертификату на Android.
Вы можете просто загрузить любой сертификат, указав имя файла из каталога активов.
Использование:
источник
Ни одно из этих исправлений не помогло моей платформе разработки, ориентированной на SDK 16, выпуск 4.1.2, поэтому я нашел обходной путь.
Мое приложение хранит данные на сервере, используя " http://www.example.com/page.php?data=somedata "
Недавно page.php был перемещен в « https://www.secure-example.com/page.php », и я продолжаю получать сообщение «javax.net.ssl.SSLException: сертификат недоверенного сервера».
Вместо того, чтобы принимать все сертификаты только для одной страницы, начиная с этого руководства, я решил свою проблему, написав свой собственный page.php, опубликованный на « http://www.example.com/page.php ».
источник
19 января 2020 г. Самозаверяющий сертификат ВЫПУСК FIX:
Чтобы воспроизвести видео, изображение, вызвать веб-сервис для любого самозаверяющего сертификата или подключиться к любому незащищенному URL-адресу, просто вызовите этот метод перед выполнением какого-либо действия, это решит вашу проблему, связанную с проблемой сертификата:
КОТЛИН КОД
источник
Может быть, это будет полезно ... это работает на клиентах Java, использующих самозаверяющие сертификаты (проверка сертификата не производится). Будьте осторожны и используйте его только для разработки, потому что это совсем не безопасно !!
Как игнорировать ошибки SSL-сертификата в Apache HttpClient 4.0
Надеюсь, это будет работать на Android, просто добавив библиотеку HttpClient ... удачи!
источник
Эта проблема возникает из-за отсутствия поддержки SNI (Server Name Identification) в A, ndroid 2.x. Я боролся с этой проблемой в течение недели, пока не наткнулся на следующий вопрос, который не только дает хорошее представление о проблеме, но также обеспечивает рабочее и эффективное решение без каких-либо пробелов в безопасности.
Ошибка «Нет сертификата пера» в Android 2.3, но НЕ в 4
источник