Android - работа със ssl сертификати (как да организираме трансфер на данни през HTTPS)

Ами ако трябва да получавате данни в android чрез защитена https връзка? Защо се генерира грешката SSLException: Неуверен сертификат на сървър ? Как да добавите сертификат от сървъра към локалното хранилище на ключове на устройство с Android? Ако се притеснявате от тези въпроси, ще намерите полезни инструкции за инсталиране на ssl сертификати и фрагмент от код за зареждането им във вашето приложение за Android.

1. Как да разберете какъв вид сертификат се използва от сървъра (на Linux/Mac Os - като правило пакетът openssl е предварително инсталиран, за Windows - действителни връзки в раздела за двоични файлове) там):

openssl s_client -connect:

за самоподписани сертификати нещо като:

ако се използва сертификат, подписан от трета компания, координатите ще се покажат, където можете да получите публичен сертификат

2. Създайте файл със сертификат

И). За самоподписан сертификат:

1. създайте празен файл my-certificate-file.pem

2. копирайте кодираните данни за сертификат в нов файл:

да, етикетите за отваряне/затваряне трябва да бъдат.

Ако сертификатът е самоподписан, можете да използвате дадения баш скрипт

ехо | 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 поддържа този тип хранилище, за да го генерираме, трябва да добавим съответния jar файл към нашия java CLASSPATH, последната версия на който може да бъде взета от тук - http://www.bouncycastle.org/latest_releases .html

за да създадете хранилище, трябва отделно да посочите доставчика на този тип хранилище, както и пътя към класа на Java, който го реализира.

(ако това не бъде направено, се появява грешка: грешка в keytool: java.security.KeyStoreException: BKS не е намерен )

4. Можем да добавим файла за съхранение към нашия проект, за да го използваме на етапа на тестване - например в папката с активи. При нормална работа очевидно трябва да се чете от конкретна директория, за да работи с текущата версия на сертификата.

5. В приложение за android е полезен следният кодов фрагмент:

Етап 1 - качете файла за съхранение с нашия сертификат:

В истинско приложение очевидно файлът ще трябва да бъде прочетен от предварително дефинирана директория.

Етап 2 - създаваме фабрика за управление на доверени връзки, тя ще се използва за проверка на сертификатите на всички https връзки (подчертавам отново - ВСИЧКИ)

След зареждане на нашия магазин за ключове, ние създаваме фабрика за управление на доверени връзки въз основа на този магазин. Използвайки тази фабрика, получаваме екземпляр на специфичния за ssl мениджър на връзки (X509TrustManager) и инициализираме SSLContext обекта, който ще се използва за създаване на сигурна връзка.

Етап 3 - посочваме кои настройки ще се използват при установяване на защитени връзки:

След това, ако сте направили всичко правилно, с всяка https връзка, съответните проверки ще бъдат извикани с помощта на подготвения файл за съхранение.

С помощта на един целенасочен читател успяхме да повдигнем завесата на тайната над грешката: „Прекратено SSL ръкостискане: ssl = 0x1fcf30: Неуспех в SSL библиотеката, обикновено грешка в протокола”Когато се опитвате да използвате двупосочно удостоверяване - т.е. ако не само клиентът проверява автентичността на сървъра, но и сървъра, проверява какъв клиент се изкачва до него.