ЕСИА#

Контейнер ключей для ЕСИА и Цифрового профиля#

Запросы на аутентификацию через внешний поставщики идентификации ЕСИА и ЦП ЕСИА должны быть подписаны электронной подписью с использованием контейнера ключей с алгоритмами ГОСТ Р 34.10-2012 и ГОСТ Р 34.11-2012. Для использования в Blitz Identity Provider необходим файловый контейнер ключа электронной подписи в одном из следующих форматов:

  • КриптоПро CSP (версия 4.0 или выше),

  • КриптоПро JCP 2.0.

Для получения контейнера ключей необходимо обратиться в аккредитованный удостоверяющий центр.

Внимание

В случае если контейнер ключей выпускается удостоверяющим центром на физический носитель, то важно указать, что контейнер ключей должен быть выпущен с экспортируемым закрытым ключом, чтобы его можно было использовать в Blitz Identity Provider.

После получения в аккредитованном удостоверяющем центре контейнера ключей его необходимо импортировать в хранилище ключей, используемое Blitz Identity Provider. Для этого можно или обратиться в техническую поддержку Blitz Identity Provider или воспользоваться одним из описанных далее в подразделах способов конвертации.

КриптоПро CSP на Windows#

Для конвертации контейнера КриптоПро CSP в Windows понадобятся:

  • ПК под управлением Windows с настроенным браузером Internet Explorer 11.

  • Платная утилита P12FromGostCSP.

  • Установленный на ПК криптопровайдер КриптоПро CSP (версия 4.0 и новее).

Инструкция по конвертации контейнера:

  1. Установить на ПК под управлением Windows криптопровайдер КриптоПро CSP (версия 4.0 и новее). Установить закрытый ключ электронной подписи в реестр Windows. Для этого выполнить шаги:

    • запустить КриптоПро CSP;

    • выбрать вкладку Сервис и нажать на кнопку Посмотреть сертификаты в контейнере:

      Просмотр сертификатов в контейнере ключей
    • нажать на кнопку Обзор:

      Просмотр сертификатов в контейнере ключей (продолжение)
    • выбрать контейнер с ключом ГОСТ Р 34.10-2012:

      Выбор контейнера ключа
    • в открывшемся окне убедиться, что выбран нужный ключевой контейнер и нажать далее:

      Проверка выбранного контейнера ключа
    • в окне со свойствами сертификата нажать на кнопку Установить:

      Установка сертификата в реестр
    • сообщение Сертификат был установлен в хранилище «Личные» текущего пользователя свидетельствует об успешном сохранении.

  2. Экспортировать ключ КриптоПро из хранилища Windows в PKCS#12. Для этого приобрести и запустить утилиту P12FromGostCSP. Нужна специальная версия утилиты – рекомендуется проконсультироваться с технической поддержкой Blitz Identity Provider.

    После запуска утилиты выполнить шаги:

    • выбрать сертификат:

      Выбор сертификата
    • задать пароль от создаваемого контейнера PKCS#12:

      Задание пароля от контейнера PKCS12
    • указать файл для сохранения PKCS#12. В качестве расширения обязательно указать .pfx:

      Сохранение файла с контейнером PKCS#12
  3. Установить на ПК окружение Java (JRE) версии 8.

  4. Импортировать ключ из PKCS#12 в BKS-хранилище с помощью бесплатной утилиты gost-keytool и актуальной версии библиотеки bcprov-jdk15on.

    java -cp "gost-keytool.jar;bcprov-jdk15on-1.70.jar" ru.reaxoft.gost.Keytool import_pkcs12 --srckeystore gost.pfx --srcstorepass 12345678 --srcalias csp_exported --srckeypass 12345678 --destkeystore blitz-keystore.bks --deststoretype BKS --deststorepass pass --destalias gost2012 --destkeypass pass
    

    В этой операции используются параметры:

    • srckeystore – путь к файлу PKCS#12;

    • srcstorepass – пароль от контейнера PKCS#12 (был задан на шаге 2);

    • srcalias – имя ключа в контейнере PKCS#12. Нужно указать значение csp_exported;

    • srckeypass – пароль к ключу в контейнере PKCS#12. Нужно указать то же самое значение, что и для параметра srcstorepass;

    • destkeystore – путь к файлу BKS blitz-keystore.bks, взятому с сервера Blitz Identity Provider;

    • deststoretype – тип хранилища. Нужно указать значение BKS;

    • deststorepass – пароль к хранилищу BKS;

    • destalias – имя (alias) ключа в BKS, например, gost2012;

    • destkeypass – пароль к ключу в BKS. Нужно указать то же самое значение, что и для параметра deststorepass.

  5. Заменить файл blitz-keystore.bks на сервере Blitz Identity Provider;

  6. Перезапустить приложения Blitz Identity Provider.

КриптоПро CSP на Linux#

Для конвертации контейнера КриптоПро CSP в Linux понадобятся:

  • ПК или сервер под управлением одного из следующих Linux: Astra Linux 1.7, РЕД ОС 7.3, Альт. В случае использование сервера рекомендуется использовать иной сервер, чем те, на которых развернут Blitz Identity Provider.

  • Бесплатная утилита CryptoPro PFX Decoder by li0ard.

Важно

Перед началом конвертации нужно сохранить контейнер ключей КриптоПро CSP в формат pfx (файл sourcekey.pfx) и сертификат открытого ключа в формат cer (sourcecrt.cer).

Инструкция по конвертации контейнера:

  1. Переключить ОС на использование ГОСТ в библиотеке OpenSSL согласно инструкции для используемой ОС: Astra Linux, РЕД ОС 7.3, Альт. Инструкция далее приводится на примере РЕД ОС 7.3 с включенной настройкой для использования ГОСТ в OpenSSL.

  2. Включить настройку ГОСТ в OpenSSL:

    openssl-switch-config gost
    
  3. Настроить зависимости (делается однократно перед первой конвертацией ключа на сервере):

    Установка модуля asn1:

    pip3 install asn1
    

    Установка модуля pyderasn:

    [fetch|wget] http://www.pyderasn.cypherpunks.ru/download/pyderasn-9.3.tar.zst
    [fetch|wget] http://www.pyderasn.cypherpunks.ru/download/pyderasn-9.3.tar.zst.asc
    gpg --verify pyderasn-9.3.tar.zst.asc pyderasn-9.3.tar.zst
    zstd -d < pyderasn-9.3.tar.zst | tar xf -
    cd pyderasn-9.3
    python setup.py install
    

    Установка pygost:

    [fetch|wget] http://www.pygost.cypherpunks.ru/pygost-5.12.tar.zst
    [fetch|wget] http://www.pygost.cypherpunks.ru/pygost-5.12.tar.zst.asc
    gpg --verify pygost-5.12.tar.zst.asc pygost-5.12.tar.zst
    zstd -d < pygost-5.12.tar.zst | tar xf -
    cd pygost-5.12
    python setup.py install
    
  4. Загрузить утилиту CryptoPro PFX Decoder by li0ard:

    [fetch|wget] https://raw.githubusercontent.com/li0ard/cpfx/pyderasn/cpfx.py
    [fetch|wget] https://raw.githubusercontent.com/li0ard/cpfx/pyderasn/schemas.py
    
  5. Конвертировать контейнер ключа из формата pfx в формат PEM с помощью CryptoPro PFX Decoder by li0ard:

    python cpfx.py sourcekey.pfx
    

    Ответ утилиты будет содержать информацию о том, в какой файл был сохранен преобразованный контейнер. Например, exported_4192476d-3e66-4963-8684-bd95d6be7967.pem.

  6. Конвертировать сертификат открытого ключа из формата DER в формат PEM c помощью OpenSSL:

    openssl x509 -in sourcecrt.cer -inform der -out sourcecrt.pem
    
  7. Собрать новый pfx-контейнер из преобразованных ключа и сертификата:

    openssl pkcs12 -export -in sourcecrt.pem -inkey 4192476d-3e66-4963-8684-bd95d6be7967.pem -out correct.pfx -name gost2012
    
  8. Установить окружение Java (JRE) версии 8.

  9. Импортировать ключ из PKCS#12 в BKS-хранилище с помощью бесплатной утилиты gost-keytool и актуальной версии библиотеки bcprov-jdk15on.

    java -cp gost-keytool.jar:bcprov-jdk15on-1.70.jar ru.reaxoft.gost.Keytool import_pkcs12 --srckeystore correct.pfx --srcstorepass 1234 --srckeypass 1234 --destkeystore blitz-keystore.bks --deststoretype BKS --deststorepass pass --destalias gost2012 --destkeypass pass --srcalias gost2012
    

    В этой операции используются параметры:

    • srckeystore – путь к сконвертированному pfx-контейнеру (PKCS#12);

    • srcstorepass – пароль от контейнера PKCS#12;

    • srcalias – имя ключа в контейнере PKCS#12. Нужно указать значение gost2012;

    • srckeypass – пароль к ключу в контейнере PKCS#12. Нужно указать то же самое значение, что и для параметра srcstorepass;

    • destkeystore – путь к файлу BKS blitz-keystore.bks, взятому с сервера Blitz Identity Provider;

    • deststoretype – тип хранилища. Нужно указать значение BKS;

    • deststorepass – пароль к хранилищу BKS;

    • destalias – имя (alias) ключа в BKS, например, gost2012;

    • destkeypass – пароль к ключу в BKS.

  10. Заменить файл blitz-keystore.bks на сервере Blitz Identity Provider;

  11. Перезапустить приложения Blitz Identity Provider.

КриптоПро JCP#

Для импорта контейнера в формате КриптоПРО JCP необходимо установить данный криптопровайдер и следовать инструкциям из официальной документации.

Вход через ЕСИА в режиме выбора организации#

Когда для входа в Blitz Identity Provider сконфигурирован внешний поставщик идентификации ЕСИА, то к обычному режиму входа пользователя можно сконфигурировать следующие дополнительные возможности:

  • Отображение пользователю экрана выбора режима входа и организации, если вошедший через ЕСИА пользователь имеет в ЕСИА роли сотрудника индивидуального предпринимателя, юридического лица или органа государственной власти.

../_images/image123.png
  • Получение из ЕСИА сведений о выбранной при входе организации, автоматическое создание на основе этих сведений в LDAP-хранилище группы пользователей с атрибутами, соответствующими организации (если соответствующая организации группа не найдена в момент входа), добавление пользователя в созданную (или найденную) группу пользователей.

  • Обновление атрибутов группы пользователя значениями атрибутов организации из ЕСИА в момент входа, если атрибуты в ЕСИА изменились.

  • Возможность добавления в маркер доступа и маркер обновления сведений о выбранной в момент входа пользователя роли в ЕСИА (физическое лицо, индивидуальный предприниматель, должностное лицо юридического лица, должностное лицо органа государственной власти).

Для настройки режимов входа необходимо предварительно настроить в Blitz Identity Provider использование групп доступа и вход через ЕСИА. После этого необходимо в конфигурационном файле в секции blitz.prod.local.idp.federation в блоке esia создать дополнительный блок настроек org следующего вида:

"federation" : {
  "points" : {
    "esia" : [
      {
        …
        "org" : {
          "embeds" : [
            "documents.elements-1",
            "addresses.elements-1",
            "contacts.elements-1"
          ],
          "group" : {
            "id" : "${org.oid}",
            "mapping" : [
              {
                "attr" : "org_ogrn",
                "master" : true,
                "value" : "${org.ogrn}"
              },
              {
                "attr" : "org_inn",
                "master" : true,
                "value" : "${org.inn}"
              },
              {
                "attr" : "org_fullname",
                "master" : true,
                "value" : "${org.fullName-}"
              },
              {
                  "attr" : "org_shortname",
                  "master" : true,
                  "value" : "${org.shortName-}"
              },
              {
                  "attr" : "org_type",
                  "master" : true,
                  "value" : "${org.type-}"
              },
              {
                  "attr" : "org_oktmo",
                  "master" : true,
                  "value" : "${org.oktmo-}"
              },
              {
                  "attr" : "org_leg",
                  "master" : true,
                  "value" : "${org.leg-}"
              },
              {
                  "attr" : "org_kpp",
                  "master" : true,
                  "value" : "${org.kpp-}"
              },
              {
                  "attr" : "org_phone",
                  "master" : true,
                  "value" : "${org.phone-}"
              },
              {
                  "attr" : "org_email",
                  "master" : true,
                  "value" : "${org.email-}"
              },
              {
                  "attr" : "org_fax",
                  "master" : true,
                  "value" : "${org.fax-}"
              },
              {
                  "attr" : "org_agencytype",
                  "master" : true,
                  "value" : "${org.agencyType-}"
              },
              {
                  "attr" : "org_agencyterrange",
                  "master" : true,
                  "value" : "${org.agencyTerRange-}"
              },
              {
                  "attr" : "org_address_post",
                  "master" : true,
                  "value" : "${org.postAddress-}"
              },
              {
                  "attr" : "org_address_leg",
                  "master" : true,
                  "value" : "${org.legalAddress-}"
              }
          ],
          "matchingRules" : [
            [
              {
                "attr" : "id",
                "value" : "${org.oid}"
              }
            ]
          ],
          "profile" : "orgs"
        },
        "scopes" : [
          "http://esia.gosuslugi.ru/org_addrs",
          "http://esia.gosuslugi.ru/org_leg",
          "http://esia.gosuslugi.ru/org_oktmo",
          "http://esia.gosuslugi.ru/org_inn",
          "http://esia.gosuslugi.ru/org_type",
          "http://esia.gosuslugi.ru/org_kpp",
          "http://esia.gosuslugi.ru/org_ctts",
          "http://esia.gosuslugi.ru/org_agencyterrange",
          "http://esia.gosuslugi.ru/org_ogrn",
          "http://esia.gosuslugi.ru/org_shortname",
          "http://esia.gosuslugi.ru/org_fullname",
          "http://esia.gosuslugi.ru/org_agencytype"
        ]
      },
      …
    ]
  }
}

В добавленном блоке нужно скорректировать:

  • набор получаемых из ЕСИА сведений об организации и их маппинг на атрибуты группы пользователей (блок group.mapping), признаком master отметить те атрибуты, которые должны перезаписываться в группе пользователей при каждом обновлении из ЕСИА, полученном в момент входа;

  • набор запрашиваемых в ЕСИА разрешений (настройка scopes).

Если необходимо передавать в маркер идентификации и маркер доступа сведения о текущей выбранной организации и о роли пользователя в ЕСИА, то необходимо настроить соответствие необходимых атрибутов ЕСИА сессионным утверждениям в Blitz Identity Provider. Это выполняется с помощью настройки claims в блоке настроек ЕСИА:

"federation" : {
  "points" : {
    "esia" : [
      {
        …
        "claims" : [
          {
            "name" : "org_id",
            "value" : "org.oid"
          },
          {
            "name" : "global_role",
            "value" : "globalRole"
          },
          {
            "name" : "org_shortname",
            "value" : "org.shortName"
          },
          {
            "name" : "org_fullname",
            "value" : "org.fullName"
          },
          {
            "name" : "org_type",
            "value" : "org.type"
          },
          {
            "name" : "org_ogrn",
            "value" : "org.ogrn"
          },
          {
            "name" : "org_inn",
            "value" : "org.inn"
          },
          {
            "name" : "org_oktmo",
            "value" : "org.oktmo"
          }
        }
      },
      …
    ]
  }
}