Android – работа с ssl-сертификатами (как организовать передачу данных через HTTPS)
Что делать, если необходимо получать данные в андроиде через защищенное https-соединение? Почему генерируется ошибка SSLException: Not trusted server certificate ? Как добавить сертификат с сервера в локальное хранилище ключей на андроид-устройстве? Если вас волнуют эти вопросы – вам будет полезна инструкция для установки ssl сертификатов и сниппет кода для их загрузки в ваше андроид-приложение.
1. Как узнать, что за сертификат используется сервером (На Linux/Mac Os – как правило, пакет openssl предустановлен, для Windows – актуальные ссылки в разделе бинарниики там):
openssl s_client -connect :
для самоподписанных сертификатов выведется нечто вроде:
если используется сертификат, подписанный сторонней компанией – будут отображены координаты, по которым можно раздобыть публичный сертификат
2. Создаем файл сертификата
А). Для самоподписанного сертификата:
1. создать пустой файл my-certificate-file.pem
2. скопировать в новый файл закодированные данные сертификата:
да, открывающий\закрывающий теги должны быть.
Если сертификат самоподписанный можно использовать данный bash-script
echo | openssl s_client -connect :
2>/dev/null | sed -ne ‘/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p’ > my-certificate-file.pem
Б). Если сертификат используемый сервером подписан сторонней организацией, на предыдущем шаге мы увидим ее контакты по которым его можно запросить. Почитать про разные типы сертификатов и попробовать онлайн-конвертер из одного типа в другой можно тут – https://www.sslshopper.com/ssl-converter.html
3. Создаем файл-хранилище с этим единственным ключом:
keytool -import -v -trustcacerts -alias myalias -file /bcprov-jdk16-146.jar -storepass
-alias myalias – псевдоним для работы с сертификатом
-keystore mystore.bks – говорим какой файл создать для хранения этого сертификата
-storetype BKS – android поддерживает такой тип хранилища, для того чтобы сгенерировать, его мы должны добавить в наш java CLASSPATH соответствующий jar-файл, последнюю версию которого можно взять отсюда – http://www.bouncycastle.org/latest_releases.html
для создания хранилища необходимо отдельно указать поставщика данного типа хранилища, а также путь к java-классу его реализующего.
(если этого не сделать появляется ошибка: keytool error: java.security.KeyStoreException: BKS not found )
4. Файл-хранилище мы можем добавить себе в проект чтобы использовать на этапе тестирования – например в папку assets. В обычном режиме работы, очевидно, его необходимо считывать из определенной директории для того чтобы работать с актуальной версией сертификата.
5. В android-приложении пригодится следующий сниппет кода:
1 этап – загружаем файл-хранилище с нашим сертификатом:
В реальном приложении, очевидно, файл необходимо будет считывать из предопределенной директории.
2 этап – создаем фабрику управления доверительными соединениями, она будет использоваться для проверки сертифкатов всех https соединений (я еще раз подчеркиваю – ВСЕХ)
После загрузки нашего хранилища ключей мы создаем фабрику для управления доверенными соединениями на основе этого хранилища. С помощью этой фабрики получаем экземпляр менеджера соединений специфичного для ssl (X509TrustManager) и инициализируем объект SSLContext, который будет использоваться для создания защищенного соединения.
3 этап – указываем какие настройки будут использоваться при установлении защищенных соединений:
После этого, если вы все сделали правильно, при каждом https соединении будут вызываться соотвествующие проверки, использующие подготовленный файл хранилище.
UPDATE 26.09.2012:
Хорошая статья по теме использования собственных сертификатов безопасности:
UPDATE 04.10.2012:
С помощью одной целеустремленной читательницы удалось приоткрыть завесу тайны над ошибкой: “SSL handshake terminated: ssl=0x1fcf30: Failure in SSL library, usually a protocol error” возникающей при попытке использовать двусторонюю аутентификацию – т.е. если не только клиент проверяет подлинность сервера но и сервер, проверяет что за клиент к нему лезет.
Источник
Android browser with ssl
Краткое описание:
Браузер направленный на безопасность и конфиденциальность.
У Privacy Browser две основные цели:
1. Минимизация информации, которая отправляется в интернет.
2. Минимизация информации, которая хранится на устройстве.
Большинство браузеров скрытно предоставляют веб-сайтам огромное количество информации, которая позволяет им отслеживать вас и нарушать вашу конфиденциальность. Сайты и рекламные сети используют JavaScript, файлы cookie, DOM-хранилище, пользовательские агенты и многие другие технологии для уникальной идентификации каждого пользователя и его отслеживания при просмотре интернета.
Поэтому чувствительные к конфиденциальности функции отключены в Privacy Browser по умолчанию. Если одна из этих технологий необходима для корректной работы веб-сайта, пользователь может включить ее только для этого визита. Кроме того, можно использовать настройки домена, чтобы автоматически включать некоторые функции при входе на определенный веб-сайт и снова отключать их при выходе.
В настоящее время для отображения веб-страниц в Privacy Browser используется встроенный в Android компонент WebView, поэтому наилучшие результаты работы браузера можно получить, используя последнюю версию этого компонента (см. https://www.stoutner.c…mmon-settings/webview/). Начиная с версии 4.x Privacy Browser будет переключен на форк WebView под названием Privacy WebView, что позволит использовать более продвинутые функции обеспечения конфиденциальности.
Внимание: Android KitKat (версия 4.4.x, API 19) поставляется со старой версией OpenSSL, которая подвержена атакам MITM (человек посередине) при просмотре веб-сайтов, использующих устаревшие протоколы и наборы шифров. Более подробную информацию по данному вопросу можно получить на сайте https://www.stoutner.c…kat-security-problems/.
Возможности:
• Встроенная блокировка рекламы EasyList.
• Поддержка прокси Tor Orbot.
• Закрепление SSL-сертификата.
• Импорт/экспорт настроек и закладок.
Требуется Android: 4.4 и выше
Русский интерфейс: Есть
3.8 (код версии 55)
24 мая 2021 года — минимальный API 19, целевой API 30
- Добавлена возможность перемещения панели приложения в нижнюю часть.
- Реализовано сохранение веб-архивов.
- Появилась возможность использования внешнего приложения для загрузки файлов.
- Добавлены дополнительные ссылки для открытия альтернативных менеджеров загрузки.
- В список поисковых систем добавлена Monocles.
- Из приложения удалено управление заголовком «Не отслеживать» и сторонними файлами cookie.
- Добавлена возможность открытия контента URL из сторонних приложений.
- Обработку URL-контента и ненадежных SSL-сертификатов теперь можно осуществлять в разделе просмотра исходного кода.
- Исправлены зависания интерфейса приложения на некоторых устройствах.
- Устранены несколько редких сбоев.
- Внесены незначительные изменения в пользовательский интерфейс.
- Обновлены переводы на русский, бразильский португальский, французский, немецкий, итальянский, испанский.
3.7 (код версии 54)
29 марта 2021 года — минимальный API 19, целевой API 29
- Выполнен редизайн доступа к файлам для работы с ограниченными по масштабу хранилищем и фреймворком доступа к хранилищу. Это позволило увеличить целевой API до 30 и исключить необходимость в опасных разрешениях READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE. К сожалению, из-за ошибки в Android WebView временно отключена возможность сохранения веб-архива.
- Обновление раздела О Privacy Browser > Разрешения.
- Увеличена информативность панели при сохранении URL.
- В список поисковых систем добавлен Metager.
- Исправлено обнаружение I2P.
- Исправлено выравнивание значков и кнопок в диалоговых окнах.
- Адресная строка теперь будет обновляться при переключении вкладок даже если в ней происходит редактирование.
- Разрешено отображение пароля в диалоговом окне HTTP-аутентификации.
- Исправлено несколько некритичных и редких сбоев.
- Исправлено превращение значка гамбургера в стрелку, если панель была открыта и выполнен перезапуск приложения.
- Меню параметров теперь открывается быстрее.
- Обновлен перевод на русский язык.
- Обновлен перевод на бразильский португальский язык, французский, немецкий, итальянский, испанский.
3.6 (код версии 52)
16 Ноябрь 2020 года — минимальный API 19, целевой API 29
- Исправлено воспроизведение буферизованного звука после закрытия вкладки.
- Доверие пользовательским сертификатам авторизации на Android 7 (API 24) и новее.
- Разрешено сохранять данные URL-адреса.
- На панель приложения добавлен новый значок для открытия панели закладок.
- Использование одного исходного файла для дневного и ночного вариантов отображения Руководства и О Privacy Browser.
- Исправлена проблема импорта настроек из версий до 3.3.
- Исправлены пользовательские заголовки, не применяемые к ссылкам, загруженным внутри WebView.
- Теперь для редактирования закладок в активности закладок достаточно одного касания.
- Исправлена проблема, связанная с редактированием закладок, в случае, если была выбрана одна неправильная.
- Добавлено отображение использования памяти в О Privacy Browser > Версия.
- Добавлены возможности сохранения, копирования и отправки email в О Privacy Browser > Версия.
- Добавлено использование Content-Type для определения неизвестного расширения файла.
- Очистка logcat после каждой загрузки страницы в режиме инкогнито.
- Очистка logcat после выбора Очистить и выйти.
- Исправлена ошибка, из-за которой закрепленные SSL-сертификаты иногда сверялись с предыдущим сертификатом веб-сайта.
- Добавлена запись Mastodon в О Privacy Browser > Ссылки.
- Сделаны различные незначительные улучшения для лучшего пользовательского опыта и графического интерфейса.
3.5.1 (код версии 51)
28 августа 2020 года — минимальный API 19, целевой API 29
- Fix a bug that caused new intents (links from other apps) to not load if Privacy Browser had been killed by the OS in the background
- Fix a bug that caused the app to initialize incorrectly if the app theme was set to the opposite of the OS theme.
3.5 (код версии 50)
18 августа 2020 года — минимальный API 19, целевой API 29
- Внедрена недавно появившаяся в Android тема День/Ночь.
- Начните использовать недавно появившуюся в WebView встроенную темную тему.
- Сохранение и восстановление состояния при перезапуске Privacy Browser в фоновом режиме операционной системой.
- Для получения имен файлов при скачивании теперь используется заголовок Content-Disposition.
- Исправлена загрузка файлов на некоторых сайтах.
- Добавлена Mojeek и удалены Qwant и Searx из списка поисковых систем.
- Устранена ошибка, при которой иногда срабатывала опция «потянуть для обновления», даже если она была отключена.
- Переопределен порядок контекстных меню.
- Применяйте пользовательские заголовки к ссылкам, загруженным из WebView.
- Обновлен перевод на русский язык.
- Обновлен перевод на французский язык (Kévin LE FLOHIC), немецкий (Bernhard G. Keller), итальянский язык (Francesco Buratti), испанский язык (Jose A. León).
3.4
• Менеджер загрузок Android заменен на собственную реализацию.
• Добавлена опция указания места скачивания по умолчанию.
• Загрузки теперь выполняются с использованием прокси.
• Теперь при переключении прокси вкладки перезагружаются.
• Добавлена возможность сохранить неочищенный URL.
• Добавлено предупреждение о том, что при сохранении существующий файл будет перезаписан.
• Добавлен пункт меню «Опции закладок». Для доступа к нему используйте жестовый интерфейс Android 10.
• Изменен порядок расположения опций в меню для предотвращения случайного создания настроек домена.
3.3 (код версии 47)
- Добавлена поддержка пользовательских прокси, включая SOCKS-прокси, и I2P.
- Сокращено название приложения в лаунчере.
- Privacy Browser теперь не отображается в списке последних приложений при закрытии с помощью кнопки «Назад».
- Сохранение настроек «на лету» во время навигации по истории.
- Разрешен любой размер шрифта.
- Добавлена опция сохранения веб-сайтов как MHT-архивов.
- Добавлена опция открытия локальных файлов.
- В контекстное меню добавлена опция открытия в фоновом режиме.
- Добавлена опция открытия закладок в новой вкладке.
- Добавлена возможность отключения тайм-аута экрана при воспроизведении видео в полноэкранном режиме.
- Отключен HSTS.
- Обновление View Source для использования заголовков Sec-Fetch.
- Обновлен перевод на русский язык, и другие.
- Повышен API до 29 (Android 10).
3.2
• Поисковая система и домашняя страница по умолчанию изменены на Startpage.
• Исправлено проксирование через Orbot в последних версиях WebView.
• Создан список UltraList.
• Исправлена проблема со списками блокировок, иногда приводившая к блокировке основного URL-адреса сайта.
• Обновлена модификация URL-адресов Facebook.
• Исправлена проблема с настройками доменов, при навигации по истории.
• Отключен таймаут подсветки экрана при просмотре полноэкранного видео.
• Добавлен виброотклик экрана и уп
2.8:
- Use the public download directory (requires write storage permission).
- Add controls for the block liststo domain settings.
- Support launching other apps using custom URLs.
- Add a bookmarks tab to the guide.
- Create an adaptive icon.
- Preserve the favorite icon when returning from the settings or domains activities.
- Add a warning that Incognito Mode disables forward and back navigation.
- Allow cookies to be saved when Incognito Mode is enabled.
- Don’t reload the webpage when restarting from the launcher.
- Partially updated German translation provided by Stefan Erhardt.
- Updated Italian translation provided by Francesco Buratti.
- First complete Russian translation.
- Updated Spanish translation provided by Jose A. León Becerra.
2.8.1:
• Add an options menu item to create/edit domain settings for the current domain.
• Open telephone number hyperlinks in the dialer.
• Fix a build error that prevented the release of 2.7 and 2.7.1 on F-Droid.
• Updated Italian translation provided by Francesco Buratti.
• Updated Spanish translation provided by Jose A. León Becerra.
В Google Play он стоит 1$. Но в F-Droid он бесплатный (И без рекламы).
Источник