Search
Write a publication
Pull to refresh

Как внедрить российские сертификаты от МинЦифры в React Native приложение

Привет, Хабр! С вами Екатерина, React Native разработчик.

Осенью 2022 года “Сбер” объявил о переводе всех своих ресурсов на работу с применением российских сертификатов от Минцифры (ссылка на новость). Это изменение затрагивало сервис онлайн-оплаты, поэтому при планировании одного из недавних спринтов я ожидаемо увидела в своем беклоге задачу по внедрению сертификатов в мобильное приложение.

О сертификатах

Изначальной причиной перехода на российские сертификаты является то, что зарубежные компании начали отзывать сертификаты безопасности у российских сайтов. После этого МинЦифры выпустило свои собственные российские сертификаты и рекомендовало перейти на их использование. Крупные российские компании уже начали переходить на новый стандарт, и “Сбер” оказался одной из первых таких компаний.

У “Сбера” есть официальная документация для подключения сертификатов https://securepayments.sberbank.ru/wiki/doku.php/certificates:start

В документации есть инструкции по внедрению сертификатов на многие популярные платформы. Однако, инструкции для React Native приложений нет, поэтому мы искали решение самостоятельно.

Android

С Android частью приложения внедрение оказалось довольно простым. Нам нужно было скачать два сертификата с Госуслуг:

  • russian_trusted_root_ca.cer - корневой;

  • russian_trusted_sub_ca.cer - выпускающий.

Для простоты их можно переименовать в root.cer и sub.cer соответственно.

После этого, перемещаем скачанные файлы в папку project_name/android/src/res/raw. Далее нужно создать файл network_security_config.xml со следующим содержанием:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">3dsecmt.sberbank.ru</domain> //домен можно не указывать, тогда сертификаты будут работать для любых доменов 
        <trust-anchors>
            <certificates src="@raw/root"/>
            <certificates src="@raw/sub"
/>
        </trust-anchors>
    </domain-config>
</network-security-config>
Hidden text

Домен можно изменить на нужный вам или же вообще убрать (в последнем случае сертификат будет работать для любых доменов на уровне всего приложения). В нашем случае используется 3dsecmt.sberbank.ru.

Этот файл помещаем в project_name/android/src/res/xml и на этом добавление сертификатов для Android устройств будет окончено.

iOS

Перейдем к внедрению для iOS устройств.

Сначала необходимо скачать сертификат для iOS с сайта госуслуг в формате .pem. Для корректного внедрения его необходимо конвертировать в формат .der. В этом поможет следующая команда:

openssl x509 -outform der -in certificate_name.pem -out certificate_name.der

Для простоты прикладываю ссылку, где можно скачать готовый сертификат в формате .der.

Далее создаем в проекте папку Certificates и добавляем в нее конвертированный сертификат. Заходим в настройки проекта в Xcode во вкладку Build Phase и добавляем в Cope Bundle Resource наш сертификат.

На нашем проекте мы используем библиотеку react-native-webview для отображения страницы оплаты в мобильном приложении. Мы воспользовались методом из библиотеки setCustomCertificatesForHost, который предназначен для добавления сертификатов в приложение.

Таким образом, в файле AppDelegate.m, нужно изменить метод didFinishLaunchingWithOptions. В него добавляем следующий код:

  // Get the bundle where the certificates in DER format are present.
  NSBundle *bundle = [NSBundle mainBundle];

  NSMutableDictionary* certMap = [NSMutableDictionary new];

  NSData *rootCertData = [NSData dataWithContentsOfFile:[bundle pathForResource:@"Russian Trusted Root CA" ofType:@"der"]];

  SecCertificateRef certificate = SecCertificateCreateWithData(NULL, (CFDataRef) rootCertData);

  OSStatus err = SecItemAdd((CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys:(id) kSecClassCertificate, kSecClass, certificate, kSecValueRef, nil], NULL);

  [certMap setObject:(__bridge id _Nonnull)(certificate) forKey:@"3dsec.sberbank.ru"];

  [RNCWebView setCustomCertificatesForHost:certMap];

Не забудьте изменить путь к сертификату, если у вас он отличается от приведенного.

На этом внедрение сертификатов для iOS устройств окончено.

Спасибо за внимание и желаю удачи с внедрением сертификатов в ваши приложения!

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.