Secure store and forward

ssh-private-public-keys2[1]

Secure store and forward (SSF) — это механизм обеспечивающий возможности использования криптографии на платформе SAP NetWeaver. Основными криптографическими задачами являются: создание цифровых подписей (ЭЦП), их проверка, шифрование и расшифровка данных.

Использование SSF возможно только совместно с крипто-продуктом (назовем его провайдером). Провайдеры могут быть внутренними или внешними. В зависимости от типа провайдера, он может поддерживать разные криптографические форматы: PKCS#7, PKCS#1 и др.

В данной статье на примере получения и проверки ЭЦП будут рассмотрены возможности стандартных библиотек криптографии SAP, а так же внешних провайдеров. Кроме того следует упомянуть что рассматривается только ABAP стек.

Внутренние провайдеры

Внутренние провайдеры представляют собой набор библиотек расположенных на уровне сервера приложений. Компания SAP предоставляет два внутренних крипто-провайдера (ABAP стек):

  • SAPSECULIB – библиотека поддерживает DSA алгоритм и может быть использована только для формирования/проверки ЭЦП (т.к. сам алгоритм не предназначен для шифрования);
  • SAPCRYPTOLIB – поддерживает как DSA, так и RSA алгоритм, с возможностью выбора размера ключа. Используется как для формирования/проверки ЭЦП, так и для шифрования (RSA);

Обе библиотеки не позволяют использовать криптографическое железо такое как: смарт-карты, токены и прочее, секретные ключи в обоих случаях будут находиться в специальных защищенных хранилищах на сервере приложения. Для возможности использования железа, необходимо использовать внешние провайдеры.

Библиотека SAPSECULIB при необходимости может быть заменена SAPCRYPTOLIB, для чего есть соответствующие ноты.

Внешние провайдеры

Внешние провайдеры представляют собой ПО расположенное на уровне сервера представления. Доступ к ним может осуществляться двумя способами:

  • Через RFC вызов SSF провайдера на локальной машине
  • Через ActiveX элемент и вызов провайдера MS Crypto-API

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

Интерфейс SSF

Интерфейс к SSF предоставляет набор модулей через которые могут быть вызваны функции крипто-провайдеров, основные из них описаны далее:

 ФМ Описание
SSF_*VERSION Получает версию крипто-провайдера
SSF_*QUERYPROPERTIES Функция возвращает значения поддерживаемых провайдером свойств: форматы шифрования, хеш-алгоритмы и т.п.
SSF_*SIGN Формирование ЭЦП
SSF_*VERIFY Проверка ЭЦП
SSF_*ENVELOPE Формирование зашифрованного сообщения
SSF_*DEVELOPE Расшифровка сообщения
SSF_*ADDSIGN Добавляет подпись к уже подписанному сообщению.
SSF_*DIGEST Получение хеша
SSF_GET_PARAMETER Получение параметров SSF приложения
SSFS_CALL_CONTROL Вызов диалога подписания через Microsoft Crypto API

* — при работе с внутренними провайдерами необходимо заменить * на KRN_, например: SSF_KRN_VERSION:

version

При использовании интерфейса SSF зачастую приходится передавать множество параметров, таких как:

  • Используемый хеш-алгоритм,
  • Необходимость включения сертификата в подпись,
  • Необходимость включения данных в подпись,
  • Алгоритм кодировки и др.

Для разных приложений, данные параметры могут различаться, чтобы не хранить их как константы, можно воспользоваться специальной настройкой. Для этого, в первую очередь, необходимо создать SSF приложение, делается это через ракурс ведения (SE16) к таблице SSFAPPLIC, создадим новую запись:

ssf_app

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

Для его настройки необходимо перейти в транзакцию STRUST и нажать F9 (Среда -> Ведение параметров SSF), зададим следующие параметры:

ssf_app_options

Получить значения параметров можно через ФМ SSF_GET_PARAMETER. Описание большинства из них приводится во встроенной документации.

Кроме параметров передаваемых непосредственно в интерфейсы SSF, тут так же имеется информация о файле профиле SSF в котором система будет получать закрытые ключи, а так же личной адресной книге, где для верификации подписей должны храниться открытые ключи (сертификаты). В нашем случае это будет один и тот же файл.

Формирование/проверка ЭЦП на сервере

В данном примере мы сформируем ЭЦП средствами SAPCRYPTOLIB на сервере приложений, а так же выполним её верификацию.

Прежде чем вызывать функции SSF необходимо получить пару – закрытый/открытый ключ и положить их в хранилище (PSE файл).

Для генерации пары воспользуемся OpenSSL – набор открытых инструментов для криптографии. В статье я не буду подробно останавливаться на инструменте OpenSSL, будут лишь приведены необходимые команды.

И так, создаем приватный ключ:

На данном шаге необходимо будет указать пароль для ключа. Для получения DSA ключа можно воспользоваться утилитой gendsa.

Сформируем открытый ключ:

Далее создадим сертификат, но прежде сформируем файл конфигурации, на базе которого будет создан сертификат, запишем в него следующее:

Команда на создание сертификата:

Для импорта пары закрытый/открытый ключ нам понадобится файл в формате PKCS#12, для его создания выполним команду:

Для того чтобы сервер приложений мог выполнять криптографические функции ему необходимо знать как получить пары закрытых/открытых ключей, за их хранение на сервере приложения отвечает PSE файл. Следующим шагом создадим PSE файл с помощью утилиты sapgenpse. Данная утилита может быть получена на SAP Marketplace, она входит в пакет SAPCRYPTOLIB. И так, создание PSE файла:

Полученный PSE файл загрузим через транзакцию STRUST:

  1. Щелкнув два раза на элементе «Файл» откроется окно выбора файла, укажем наш client.pse, после чего система запросит пароль, укажем тот, что указывали при создании PSE.
  2. Открыв PSE на просмотр, сохраним его для ранее созданного приложения ZSSFAP: Меню -> СПП -> Сохранить как -> SSF приложение -> ZSSFAP

На данном этапе мы записали хранилище (PSE) на сервер приложений, доступ к нему можно получить по адресу указанному в серверном параметре (тр. RZ11) – «ssf*/ssfapi_lib». (На стороне SAP может быть до 3-х крипто-провайдеров, для того чтобы ими воспользоваться должны быть выполнены соответствующие настройки в параметрах сервера, которые можно найти по маске ssf*. Описание данных параметров можно найти в документации к ним).

Для тестирования ЭЦП запустим программу SSF02 и укажем следующие параметры:

  • Выбор функции: подписать
  • Включить сертификаты – пусто
  • Без данных оригинала – X
  • Идентификатор: EMAIL=sidorochkin@gmail.ru, CN=SIDOROCHKIN, OU=DEV, O=OCRV, L=SPB, SP=SPB
  • SSF профиль: SAPSSF_ZSSFAP200.pse
  • Данные ввода: 123.txt
  • Данные вывода: 123.txt.sig
  • Продукт защиты: SAPSECULIB
  • Выполнить немедленно – X
  • Хеш-алгоритм — SHA1

Запишем в файл 123.txt любую  текстовую последовательность, например: 123.

После выполнения программы мы получим файл 123.txt.sig, в котором будет содержаться цифровая подпись:

SSF_SIGN

Для её верификации изменим параметры и запустим вновь:

  • Выбор функции: Верифицировать
  • Данные ввода: 123.sig
  • Данные вывода – пусто
  • Данные сравнения: 123.txt
  • Личная адресная книга – PAB: SAPSSF_ZSSFAP.pse (необходима для верификации относительно сертификата (открытого ключа))

Верификация пройдена:

ssf_verify

Кроме программы SSF02, верифицировать ЭЦП можно и внешними средствами, такими как КриптоАРМ.

Далее приводится код простой ABAP программы выполняющий формирование/проверку ЭЦП на стороне сервера приложений для текстовой строки:

Формирование/проверка ЭЦП средствами внешнего крипто-провайдера

Зачастую требуется обеспечить формирование квалифицированной ЭЦП, т.е. той, которая выполняется на основании закрытого ключа выданного центром сертификации прошедшим проверку соответствующими органами (ФСБ и пр.). К сожалению, как правило, такие центры оперируют алгоритмами ГОСТ, который не может быть обработан крипто-провайдерами SAP. На помощь приходят внешние крипто-провайдеры. Взаимодействие с ними, как это было уже упомянуто ранее, можно построить двумя способами:

  1. Путём вызова специального диалога, который связывается с установленным в системе крипто-провайдером через Microsoft Crypto API, вызов соответствующих API реализован в ActiveX элементе.
  2. Путём вызова функций SSF через RFC с обращением к локальной машине пользователя.

Первый способ позволяет только получать ЭЦП относительно указанных данных. Вызов диалога  осуществляется через ФМ SSFS_CALL_CONTROL:

Диалог выглядит следующим образом:

dialog

В системе есть демонстрационная программа SSFSDEMO в которой так же вызывается указанный ФМ. К сожалению данный способ весьма ограничен в настройке, нельзя, например, убрать из списка не действительные сертификаты или сертификаты не предназначенные для ЭЦП. Однако есть специальная нота, которая решает эти проблемы.

Второй способ подразумевает перед его использованием дополнительную настройку:

  1. На локальной машине пользователя должна быть установлена SSF библиотека.
  2. В используемой системе должен быть определен RFC адрес для доступа к GUI (По умолчанию это — SAP_SSFATGUI см. тр. SM59)
  3. На компьютере пользователя необходимо настроить путь к библиотеке SSF, чтобы SAP GUI мог вызывать её функции. Настройка выполняется в файле ssfrfc.ini. В моем случае я использую библиотеку КриптоПро SSF, и файл содержит только строку с путём к SSF библиотеке:

  1. Для возможности подписания/верификации крипто-провайдер должен обладать всеми нужными ему данными. Необходимо убедиться, что на локальной машине установлены нужные сертификаты. Просмотр сертификатов в Windows можно вызвать через соответствующую надстройку: Пуск -> Выполнить -> certmgr.msc.

Более подробно о настройке SSF вы можете почитать в официальной документации.

Далее приведен код простейшей ABAP программы для работы с внешним крипто-провайдером:

Обратите внимание на параметр подписанта, в вашей системе идентификатор будет иным.

Для проверки работы внешних провайдеров проще всего воспользоваться упомянутой ранее программой SSF02, параметры будут аналогичными ранее указанным, за исключением того, что нужно будет указать RFC адрес и хеш-алгоритм внешнего провайдера.

Дополнительная информация

Начиная с версии 1.0.0, в OpenSSL включили в состав утилиты для работы с алгоритмами ГОСТ, благодаря чему мы можем формировать и верифицировать квалифицированные ЭЦП из ABAP, взаимодействуя с OpenSSL, например, через файловый интерфейс. Более подробную информацию по поддержке ГОСТ можно найти как на официальном сайте, так и на других, например, тут.

Официальная документация по SSF доступна по адресу: https://websmp201.sap-ag.de/home -> Products -> Security -> Secure Collaboration и на help.sap.com.

Спецификация по SSF API. Для тех, кто решит создать свой SSF провайдер, есть отдельная спецификация. Теоретическая часть по ЭЦП в SAP была рассмотрена в данной статье.

11 комментариев

  1. Добрый день.
    Пробовал загружать в систему сертификаты по ГОСТ 2012, но у них не определяется владелец. Из-за чего их не сохранить в системе. Не пробовали грузить такие сертификаты?

    1. Добрый день!

      Стандартная криптографическая библиотека насколько я знаю не работает с ГОСТ-ом, варианты мне кажется следующие:
      1. Писать расширение для неё (вроде как SAP даёт для этого API),
      2. Написать некое решение (например на Java) или использовать OpenSSL, запуская это все на сервере приложения (сертификаты хранятся там же).
      3. Использовать стороннее решение, которое либо расширяет библиотеку способом из п.1, либо предоставляет SSF интерфейс через RFC вызовы (для SAP GUI).

      1. Добрый день.
        Тут именно проблема в получении информации о сертификате в SAP. Приходиться использовать ole-утилиту для получения хоть какой-то информации о сертификатах в личном хранилище пользователя. А у нее тоже весьма ограниченные функции.
        Хотя есть вот такая программа SSFSDEMO, которая каким-то способом получает данные о сертификатах.

        1. Указанная программа использует OLE объект SAPSIGN.SAPSignCtrl.1, но среди его методов нет отдельных методов чтения данных об установленных сертификатах.

          Можно через какой-нибудь PowerShell получить информацию о сертификатах: https://ilovepowershell.com/2015/03/20/looking-at-installed-certificates-with-powershell/

  2. Добрый день!

    Спасибо за статью!

    Вы не сталкивались с шифрованием данных через SAPSECULIB?
    Настроил по статье — все хорошо (шифрует-расшифровывает), но не просит private key пароль для расшифровки.

    Хотелось бы чтобы просил 🙂
    В OpenSSL делал пароль для *.pem, да и в STRUST выбрал галочку Always require password.

    Если пытаюсь ввести левый пароль в SSF02 — не работает, с пустым паролем ОК.
    Значит настраивает пароль как пустой.

    По дебагу SSF02 вообще — если RFC пусто то пароль не нужен.
    Начинаю думать, что дело в библиотеке и нужна SAPCRYPTOLIB

  3. >Настройка выполняется в файле ssfrfc.ini.
    А где должен находиться файл ssfrfc.ini?

  4. Добрый день! Подскажите, пожалуйста, какие есть способы вытащить ID сертификата при использовании функции ssf ? (для штампа требуется Номер сертификата)

    1. Добавлю, в ssf.ini параметр CP_SSF_USERID=CERT_HASH, но требуется номер сертификата, а не отпечатка, значение по умолчанию не подходящее

  5. Добрый день!
    подскажите, можно ли используя SSF выполнять подписание с помощью внешнего крипто провайдера, расположенного на отдельном сервере? при этом закрытая часть у пользователя на флешке, а сертификат может быть установлен предварительно на сервер.
    Спасибо!

Добавить комментарий

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