Как сделать совместимое Android приложение с сертификатом от минцифры

В связи с ситуацией в мире компании вынужденно переходят от глобальных белых сертификатов на сертификаты от минцифры и проблема тут возникает как из-за отсутствия корневых сертификатов минцифры в 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

Android SDK Build Tools 24.0.3

https://developer.android.com/tools/releases/build-tools

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *