В связи с ситуацией в мире компании вынужденно переходят от глобальных белых сертификатов на сертификаты от минцифры и проблема тут возникает как из-за отсутствия корневых сертификатов минцифры в android, так и особенностей безопасности самих мобильных устройств.
К примеру для Android до 6.x вы можете поставить сертификаты вручную и проблема будет решена. В более новых Android политика более жесткая и если разработчик приложения оставил параметры безопасности по-умолчанию,то доверие будет только корневым сертификатам установленным в систему Android. Правила доверия описываются в res\xml\network_security_config.xml.
Если разработчик не создал данный конфиг или оставил только system, то все установленные пользовательские сертификаты будут игнорироваться.
<network-security-config>
<base-config>
<trust-anchors>
<!-- Trust preinstalled CAs -->
<certificates src="system" />
<!-- Additionally trust user added CAs -->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
Для решения данной проблемы необходимо пересобрать apk с добавлением user.
В этом случае мы разрешим доверять установленным пользователем сертификатам, но можно сделать более красивое решение. Интегрировать сертификаты минцифры в приложение, тем самым исключить необходимость установки сертификатов.
Сертификаты минцифры сохраняем в папку res\raw с именами rootca,subca и создаем следующий network_security_config.xml. Сертификат subca действует до 06.03.2027г.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<trust-anchors>
<certificates src="@raw/rootca" />
<certificates src="@raw/subca" />
</trust-anchors>
</domain-config>
<base-config>
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
Можно сделать ограничение применимости данных сертификатов к конкретному домену, в этом случае в domain-config нужно добавить еще:
<domain includeSubdomains="false">service.test.com</domain>
Теперь поговорим о том, как пересобрать APK.
Нам потребуется Apktool:
Apktool – How to Install (ibotpeaches.github.io)
Для получения исходного APK файла можно воспользоваться сервисом https://apkcombo.com/
Для распаковки: apktool d app.apk
Для сборки: apktool b app -o app_patched.apk
Следующий важный момент, это подписание приложения цифровой подписью. При чем с 10-ого Android был изменен метод для подписи на V2. Если раньше можно было воспользоваться jarsigner из jdk, то теперь необходимо использовать apksigner из состава Android SDK Build Tools 24.0.3 и выше из Android Studio (см ниже)
// создание ключа подписи через JDK
jdk\bin\keytool.exe -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias mysign
// v1 подпись приложения APK для android 7,8,9
jdk\bin\jarsigner -keystore key.jks app_patched.apk mysign
// v2 подпись приложения APK для android 10 и выше
build-tools\apksigner.bat sign --ks key.jks app_patched.apk
Где скачать CRT сертификаты от минцифры и списки отзыва CRL:
https://www.company.rt.ru/cdp/rootca_ssl_rsa2022.crt
https://www.company.rt.ru/cdp/subca_ssl_rsa2022.crt
http://company.rt.ru/cdp/rootca_ssl_rsa2022.crl
http://reestr-pki.ru/cdp/rootca_ssl_rsa2022.crl
https://www.company.rt.ru/cdp/subca_ssl_rsa2022.crl
Для Android приложения crt файлы нужно пересохранить в base64 формате.
Ссылки по теме:
apksigner | Android Developers
Make APK Accept CA Certificate – HackTricks
Android SDK Build Tools All Version