Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Терминология

Токен - Рутокен ЭЦП Bluetooth, поддерживающий обмен по защищённому каналу. Т. основан на Рутокен ЭЦП, содержит в себе реализацию российских криптографических алгоритмов шифрования и электронной подписи.

...

Пароль инициализации - специальный пароль, записанный на карточке, входящей в комплект поставки Токена. Без знания пароля инициализации приложение не может произвести первоначальную инициализацию защищённого канала с Токеном.

Общая схема

Шифрование в защищённом канале происходит на короткоживущих сессионных ключах, которые в процессе работы канала периодически меняются.

...

Важно понимать, что, хотя первоначальная инициализация защищённого канала требует дополнительных действий, после её прохождения защищённый канал начинает работать совершенно прозрачно, как будто его и нет.

Алгоритм первоначальной инициализации защищенного канала

В первую очередь, для проверки, что защищенный канал еще не инициализирован, необходимо перечислить список подключенных доступных КриптоПро CSP считывателей:

...

После первоначальной инициализации защищенного канала в возвращенном функцией getReaderList() массиве считывателей у объекта CProReader с именем name=@"Aktiv Rutoken ECP BT XXXXXXXX" поле media имеет будет значение @"rutoken_ecp_YYYYYYY", и дальнейшее взаимодействие с Токеном через КриптоПро CSP на мобильном устройстве ничем не отличается от взаимодействия с Токеном на других платформах.

Условия работы защищённого канала

Защищённый канал устанавливается между парой конкретных экземпляров приложения и Токена.

...

Несколько приложений одного и того же разработчика могут пользоваться одной и той же ключевой информацией, которая генерируется при инициализации защищённого канала одним из приложений. Это позволяет уменьшить количество ввода "пароля инициализации" пользователем до одного раза, даже если он устанавливает не одно приложение, а целый пакет. Пароль инициализации может быть введён в любом приложении и другие приложения при этом будут вести себя так, как будто в них он уже введен.

Требования к приложению

На приложение, обращающееся к Токену накладываются следующие требования:

...

  • В Info.plist приложения должен быть указан протокол поддерживаемых внешних устройств (Supported external accessory protocols) со значением "com.aktivco.rutokenecp"

    Code Block
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        ...
        <key>UISupportedExternalAccessoryProtocols</key>
        <array>
        ...
            <string>com.aktivco.rutokenecp</string>
        ...
        </array>
    ...
    </dict>
    </plist>
  • В случае, если требуется обеспечить возможность одной и той же ключевой информации в нескольких приложениях разработчика, необходимо обеспечить выполнение следующих требований:

    •  В ресурсы приложения должен быть добавлен файл Entitlements.plist следующего содержания:

      Code Block
      titleEntitlements.plist
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
          <key>application-identifier</key>
          <string>YYYYYYYYYY.my.company.app-identifier</string>
          <key>get-task-allow</key>
          <true/>
          <key>keychain-access-groups</key>
          <array>
              <string>YYYYYYYYYY.my.company.keychainAccessGroupWithRutokenStringInIt</string>
          </array>
      </dict>
      </plist>

      где my.company.app-identifier – идентификатор приложения, YYYYYYYYYY – Team ID (https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingProfiles/MaintainingProfiles.html), также известный как Bundle Seed ID или App ID prefix (https://developer.apple.com/library/mac/documentation/general/conceptual/devpedia-cocoacore/AppID.html),

      my.company.keychainAccessGroupWithRutokenStringInIt -- идентификатор хранилища ключей (подробнее https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/Reference/reference.html#//apple_ref/doc/uid/TP30000898-CH1g-SW2), в которую будут сохраняться долговременные ключи на мобильном устройстве – данная строка должна содержать в себе подстроку "rutoken".

    • Приложение должно быть подписано с указанием в качестве источника entitlements файла Entitlements1.plist (имя может быть использовано любое), в котором должен содержаться параметр keychain-access-groups со значением
      YYYYYYYYYY.my.company.keychainAccessGroupWithRutokenStringInIt.
      Code Block
      titleEntitlements.plist
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
          ...
          <key>keychain-access-groups</key>
          <array>
              ...
              <string>YYYYYYYYYY.my.company.keychainAccessGroupWithRutokenStringInIt</string>
              ...
          </array>
      ...
      </dict>
      </plist>


      Для этого в Xcode в настройке параметров сборки приложения в параметре "Code Signing"->"Code Signing Entitlements" необходимо указать путь до Entitlements1.plist.

    • Для того чтобы воспользоваться возможностью ввода пароля инициализации один раз для всех приложений разработчика, строка YYYYYYYYYY.my.company.keychainAccessGroupWithRutokenStringInIt в файлах Entitlements.plist и Entitlements1.plist этих приложений должна быть одинаковая и эти приложения должны быть подписаны одной и той же подписью Apple Developer ID.

    В случае, если перечисленные требования не выполнены или выполнены не в полной мере, возможны следующие варианты:
    • Корректный файл Entitlements.plist добавлен в ресурсы приложения, но приложение подписано без указания Entitlements1.plist в качестве источника entitlements (или в Entitlements1.plist не указан параметр keychain-access-groups с тем же значением, что в Entitlements.plist) – инициализация защищенного канала будет завершена с ошибкой; открытие защищенного канала невозможно.
    • Файл Entitlements.plist не добавлен в ресурсы приложения и приложение подписано без указания Entitlements1.plist в качестве источника entitlements (или в Entitlements1.plist не указан параметр keychain-access-groups) – инициализация защищенного канала пройдет успешно, сохраненная ключевая информация доступна только одному приложению.
    • Файл Entitlements.plist не добавлен в ресурсы приложения, и приложение подписано с указанием Entitlements1.plist в качестве источника entitlements, и в Entitlements1.plist указан параметр keychain-access-groups, в котором первым значением в массиве является строка "YYYYYYYYYY.my.company.someKeychainAccessGroup", – инициализация защищенного канала пройдет успешно, сохраненная ключевая информация будет доступна всем приложениям разработчика, которые аналогично подписаны с указанием Entitlements1.plist в качестве источника entitlements, где в Entitlements1.plist указан параметр keychain-access-groups, в котором первым значением в массиве является строка "YYYYYYYYYY.my.company.someKeychainAccessGroup".
  • Приложение должно быть слинковано со следующими фреймворками:
    • RDRRtSupCp.framework – модуль поддержки считывателя Rutoken ECP BT для КриптоПро;
    • RtPKCS11ECP.framework – модуль, реализующий стандарт PKCS#11;
    • RtPcsc.framework – модуль поддержки PCSC-уровня;
    • стандартные фреймворки Security.framework, ExternalAccessory.Framework, Foundation.framework.

Примерный порядок действий пользователя при взаимодействии с приложением

Примерный порядок действий пользователя при первом запуске приложения поддерживающего установку защищённого канала с Токеном

1) пользователь запускает приложение

...

5) Приложение работает с контейнером на Токене

Примерный порядок действий при повторном запуске приложения

1) пользователь запускает приложение

...