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:
При использовании интерфейса SSF зачастую приходится передавать множество параметров, таких как:
- Используемый хеш-алгоритм,
- Необходимость включения сертификата в подпись,
- Необходимость включения данных в подпись,
- Алгоритм кодировки и др.
Для разных приложений, данные параметры могут различаться, чтобы не хранить их как константы, можно воспользоваться специальной настройкой. Для этого, в первую очередь, необходимо создать SSF приложение, делается это через ракурс ведения (SE16) к таблице SSFAPPLIC, создадим новую запись:
Значение X отвечает за возможность определения параметра для приложения, если оставить значение пустым, для текущего приложения нельзя будет настроить указанный параметр. Сохраним приложение, проставив везде X.
Для его настройки необходимо перейти в транзакцию STRUST и нажать F9 (Среда -> Ведение параметров SSF), зададим следующие параметры:
Получить значения параметров можно через ФМ SSF_GET_PARAMETER. Описание большинства из них приводится во встроенной документации.
Кроме параметров передаваемых непосредственно в интерфейсы SSF, тут так же имеется информация о файле профиле SSF в котором система будет получать закрытые ключи, а так же личной адресной книге, где для верификации подписей должны храниться открытые ключи (сертификаты). В нашем случае это будет один и тот же файл.
Формирование/проверка ЭЦП на сервере
В данном примере мы сформируем ЭЦП средствами SAPCRYPTOLIB на сервере приложений, а так же выполним её верификацию.
Прежде чем вызывать функции SSF необходимо получить пару – закрытый/открытый ключ и положить их в хранилище (PSE файл).
Для генерации пары воспользуемся OpenSSL – набор открытых инструментов для криптографии. В статье я не буду подробно останавливаться на инструменте OpenSSL, будут лишь приведены необходимые команды.
И так, создаем приватный ключ:
1 |
openssl genrsa -out private.pem |
На данном шаге необходимо будет указать пароль для ключа. Для получения DSA ключа можно воспользоваться утилитой gendsa.
Сформируем открытый ключ:
1 |
openssl rsa -in private.pem -out public.pem –pubout |
Далее создадим сертификат, но прежде сформируем файл конфигурации, на базе которого будет создан сертификат, запишем в него следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[ req ] # Секция основных опций default_bits = 2048 # Число бит default_keyfile = private.pem # Имя ключа, используемого для сертификата distinguished_name = req_distinguished_name # DN организации, выдавшей сертификат prompt = no # Брать параметры из конфига неинтерактивный режим [ req_distinguished_name ] # DN организации CN=RU # Страна ST=SPB # Область L=SPB # Город O=OCRV # Название организации OU=DEV # Название отделения CN=SIDOROCHKIN # Имя для сертификата (персоны, получающей сертификат) emailAddress=sidorochkin@gmail.ru # Мыло организации |
Команда на создание сертификата:
1 |
openssl req -new -x509 -key private.pem -out cert.crt -days 365 -config config.cfg -sha1 |
Для импорта пары закрытый/открытый ключ нам понадобится файл в формате PKCS#12, для его создания выполним команду:
1 |
openssl pkcs12 -export -in cert.crt -inkey private.pem -out client.p12 -name "PK12 File" |
Для того чтобы сервер приложений мог выполнять криптографические функции ему необходимо знать как получить пары закрытых/открытых ключей, за их хранение на сервере приложения отвечает PSE файл. Следующим шагом создадим PSE файл с помощью утилиты sapgenpse. Данная утилита может быть получена на SAP Marketplace, она входит в пакет SAPCRYPTOLIB. И так, создание PSE файла:
1 |
sapgenpse import_p12 -p d:\ossl\bin\client.pse d:\ossl\bin\client.p12 |
Полученный PSE файл загрузим через транзакцию STRUST:
- Щелкнув два раза на элементе «Файл» откроется окно выбора файла, укажем наш client.pse, после чего система запросит пароль, укажем тот, что указывали при создании PSE.
- Открыв 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, в котором будет содержаться цифровая подпись:
Для её верификации изменим параметры и запустим вновь:
- Выбор функции: Верифицировать
- Данные ввода: 123.sig
- Данные вывода – пусто
- Данные сравнения: 123.txt
- Личная адресная книга – PAB: SAPSSF_ZSSFAP.pse (необходима для верификации относительно сертификата (открытого ключа))
Верификация пройдена:
Кроме программы SSF02, верифицировать ЭЦП можно и внешними средствами, такими как КриптоАРМ.
Далее приводится код простой ABAP программы выполняющий формирование/проверку ЭЦП на стороне сервера приложений для текстовой строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
PARAMETERS: p_text TYPE string DEFAULT '123'. DATA: gv_data TYPE xstring, gv_error TYPE text80, gt_signer LIKE STANDARD TABLE OF ssfinfo, gt_sign LIKE STANDARD TABLE OF ssfbin, gt_data LIKE gt_sign WITH HEADER LINE, gv_sign_len LIKE ssfparms-sigdatalen, gv_crc LIKE ssfparms-ssfcrc, gv_datalen LIKE ssfparms-indatalen. START-OF-SELECTION. CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = p_text IMPORTING buffer = gv_data EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = gv_data IMPORTING output_length = gv_datalen TABLES binary_tab = gt_data. CALL FUNCTION 'SSF_KRN_SIGN_BY_AS' EXPORTING ssfapplication = 'ZSSFAP' ostr_input_data_l = gv_datalen b_detached = 'X' b_inc_certs = ' ' IMPORTING ostr_signed_data_l = gv_sign_len crc = gv_crc TABLES ostr_input_data = gt_data ostr_signed_data = gt_sign EXCEPTIONS ssf_krn_error = 1 ssf_krn_noop = 2 ssf_krn_nomemory = 3 ssf_krn_opinv = 4 ssf_krn_nossflib = 5 ssf_krn_input_data_error = 6 ssf_krn_invalid_par = 7 ssf_krn_invalid_parlen = 8 ssf_fb_input_parameter_error = 9 OTHERS = 10. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. IF gv_crc IS NOT INITIAL. CALL FUNCTION 'SSF_ERRORMESSAGE' EXPORTING crc = gv_crc result = 0 IMPORTING errortext = gv_error EXCEPTIONS error = 1 others = 2. WRITE : / `Ошибка получения подписи: `, gv_error. EXIT. ENDIF. CALL FUNCTION 'SSF_KRN_VERIFY_BY_AS' EXPORTING ssfapplication = 'ZSSFAP' ostr_signed_data_l = gv_sign_len ostr_input_data_l = gv_datalen IMPORTING crc = gv_crc TABLES ostr_signed_data = gt_sign ostr_input_data = gt_data ostr_output_data = gt_data signer_result_list = gt_signer " Информация о подписанте EXCEPTIONS ssf_krn_error = 1 ssf_krn_noop = 2 ssf_krn_nomemory = 3 ssf_krn_opinv = 4 ssf_krn_nossflib = 5 ssf_krn_input_data_error = 6 ssf_krn_invalid_par = 7 ssf_krn_invalid_parlen = 8 ssf_fb_input_parameter_error = 9 OTHERS = 10. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. IF gv_crc IS NOT INITIAL. CALL FUNCTION 'SSF_ERRORMESSAGE' EXPORTING crc = gv_crc result = 0 IMPORTING errortext = gv_error EXCEPTIONS error = 1 others = 2. WRITE : / `Ошибка сверки подписи: `, gv_error. EXIT. ENDIF. CLEAR: gv_data, p_text. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = gv_sign_len IMPORTING buffer = gv_data TABLES binary_tab = gt_sign EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CALL FUNCTION 'SSFC_BASE64_ENCODE' EXPORTING bindata = gv_data binleng = gv_sign_len IMPORTING b64data = p_text EXCEPTIONS ssf_krn_error = 1 ssf_krn_noop = 2 ssf_krn_nomemory = 3 ssf_krn_opinv = 4 ssf_krn_input_data_error = 5 ssf_krn_invalid_par = 6 ssf_krn_invalid_parlen = 7 OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. WRITE `ЭЦП (BASE64):` COLOR COL_HEADING. WRITE: / p_text. |
Формирование/проверка ЭЦП средствами внешнего крипто-провайдера
Зачастую требуется обеспечить формирование квалифицированной ЭЦП, т.е. той, которая выполняется на основании закрытого ключа выданного центром сертификации прошедшим проверку соответствующими органами (ФСБ и пр.). К сожалению, как правило, такие центры оперируют алгоритмами ГОСТ, который не может быть обработан крипто-провайдерами SAP. На помощь приходят внешние крипто-провайдеры. Взаимодействие с ними, как это было уже упомянуто ранее, можно построить двумя способами:
- Путём вызова специального диалога, который связывается с установленным в системе крипто-провайдером через Microsoft Crypto API, вызов соответствующих API реализован в ActiveX элементе.
- Путём вызова функций SSF через RFC с обращением к локальной машине пользователя.
Первый способ позволяет только получать ЭЦП относительно указанных данных. Вызов диалога осуществляется через ФМ SSFS_CALL_CONTROL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
PARAMETERS: p_text TYPE string DEFAULT '123'. DATA: gv_data TYPE xstring, gv_crc TYPE i, gv_error TYPE text80, gv_sign_len LIKE ssfparms-sigdatalen. START-OF-SELECTION. CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = p_text IMPORTING buffer = gv_data EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CALL FUNCTION 'SSFS_CALL_CONTROL' EXPORTING bindocument = gv_data doc_type = 'TXT' b_detached = abap_true IMPORTING crc = gv_crc signature = gv_data EXCEPTIONS parameter_error = 1 conversion_error = 2 control_error = 3 frontend_error = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. IF gv_crc IS NOT INITIAL. CALL FUNCTION 'SSF_ERRORMESSAGE' EXPORTING crc = gv_crc result = 0 IMPORTING errortext = gv_error EXCEPTIONS error = 1 others = 2. WRITE : / `Ошибка получения подписи: `, gv_error. EXIT. ENDIF. gv_sign_len = xstrlen( gv_data ). CALL FUNCTION 'SSFC_BASE64_ENCODE' EXPORTING bindata = gv_data binleng = gv_sign_len IMPORTING b64data = p_text EXCEPTIONS ssf_krn_error = 1 ssf_krn_noop = 2 ssf_krn_nomemory = 3 ssf_krn_opinv = 4 ssf_krn_input_data_error = 5 ssf_krn_invalid_par = 6 ssf_krn_invalid_parlen = 7 OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. WRITE `ЭЦП (BASE64):` COLOR COL_HEADING. WRITE: / p_text. |
Диалог выглядит следующим образом:
В системе есть демонстрационная программа SSFSDEMO в которой так же вызывается указанный ФМ. К сожалению данный способ весьма ограничен в настройке, нельзя, например, убрать из списка не действительные сертификаты или сертификаты не предназначенные для ЭЦП. Однако есть специальная нота, которая решает эти проблемы.
Второй способ подразумевает перед его использованием дополнительную настройку:
- На локальной машине пользователя должна быть установлена SSF библиотека.
- В используемой системе должен быть определен RFC адрес для доступа к GUI (По умолчанию это — SAP_SSFATGUI см. тр. SM59)
- На компьютере пользователя необходимо настроить путь к библиотеке SSF, чтобы SAP GUI мог вызывать её функции. Настройка выполняется в файле ssfrfc.ini. В моем случае я использую библиотеку КриптоПро SSF, и файл содержит только строку с путём к SSF библиотеке:
1 |
SSF_LIBRARY_PATH = C:\Program Files\Crypto Pro\SSF\cpsapssf.dll |
- Для возможности подписания/верификации крипто-провайдер должен обладать всеми нужными ему данными. Необходимо убедиться, что на локальной машине установлены нужные сертификаты. Просмотр сертификатов в Windows можно вызвать через соответствующую надстройку: Пуск -> Выполнить -> certmgr.msc.
Более подробно о настройке SSF вы можете почитать в официальной документации.
Далее приведен код простейшей ABAP программы для работы с внешним крипто-провайдером:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
PARAMETERS: p_text TYPE string DEFAULT '123'. DATA: gv_data TYPE xstring, gv_error TYPE text80, gt_signer LIKE STANDARD TABLE OF ssfinfo, gt_sign LIKE STANDARD TABLE OF ssfbin, gt_data LIKE gt_sign WITH HEADER LINE, gt_data_ex LIKE gt_sign WITH HEADER LINE, gv_sign_len LIKE ssfparms-sigdatalen, gv_crc LIKE ssfparms-ssfcrc, gv_datalen LIKE ssfparms-indatalen. FIELD-SYMBOLS: <gs_signer> LIKE LINE OF gt_signer. START-OF-SELECTION. CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = p_text IMPORTING buffer = gv_data EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = gv_data IMPORTING output_length = gv_datalen TABLES binary_tab = gt_data. APPEND INITIAL LINE TO gt_signer ASSIGNING <gs_signer>. <gs_signer>-id = 'E = Sidorochkin@ocrv.RU'. CALL FUNCTION 'SSF_SIGN' EXPORTING ssf_dest = 'SAP_SSFATGUI' b_inc_certs = ' ' b_detached = 'X' ostr_input_data_l = gv_datalen str_hashalg = 'GOST3411' IMPORTING ostr_signed_data_l = gv_sign_len crc = gv_crc TABLES ostr_input_data = gt_data signer = gt_signer ostr_signed_data = gt_sign EXCEPTIONS ssf_rfc_error = 1 ssf_rfc_no_memory = 2 ssf_rfc_get_data_error = 3 ssf_rfc_send_data_error = 4 ssf_rfc_signer_list_error = 5 ssf_rfc_input_data_error = 6 ssf_fb_input_parameter_error = 7 ssf_rfc_destination_error = 8 OTHERS = 9. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. IF gv_crc IS NOT INITIAL. CALL FUNCTION 'SSF_ERRORMESSAGE' EXPORTING crc = gv_crc result = 0 IMPORTING errortext = gv_error EXCEPTIONS error = 1 others = 2. WRITE : / `Ошибка получения подписи: `, gv_error. EXIT. ENDIF. CLEAR: gt_signer. CALL FUNCTION 'SSF_VERIFY' EXPORTING ssf_dest = 'SAP_SSFATGUI' b_inc_certs = ' ' ostr_signed_data_l = gv_sign_len ostr_input_data_l = gv_datalen str_pab = '' str_pab_password = '' IMPORTING crc = gv_crc TABLES ostr_signed_data = gt_sign ostr_input_data = gt_data signer_result_list = gt_signer ostr_output_data = gt_data_ex EXCEPTIONS ssf_rfc_error = 1 ssf_rfc_no_memory = 2 ssf_rfc_get_data_error = 3 ssf_rfc_send_data_error = 4 ssf_rfc_input_data_error = 5 ssf_fb_input_parameter_error = 6 ssf_rfc_destination_error = 7 OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. IF gv_crc IS NOT INITIAL. CALL FUNCTION 'SSF_ERRORMESSAGE' EXPORTING crc = gv_crc result = 0 IMPORTING errortext = gv_error EXCEPTIONS error = 1 others = 2. WRITE : / `Ошибка сверки подписи: `, gv_error. EXIT. ENDIF. CLEAR: gv_data, p_text. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = gv_sign_len IMPORTING buffer = gv_data TABLES binary_tab = gt_sign EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CALL FUNCTION 'SSFC_BASE64_ENCODE' EXPORTING bindata = gv_data binleng = gv_sign_len IMPORTING b64data = p_text EXCEPTIONS ssf_krn_error = 1 ssf_krn_noop = 2 ssf_krn_nomemory = 3 ssf_krn_opinv = 4 ssf_krn_input_data_error = 5 ssf_krn_invalid_par = 6 ssf_krn_invalid_parlen = 7 OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. WRITE `ЭЦП (BASE64):` COLOR COL_HEADING. WRITE: / p_text. |
Обратите внимание на параметр подписанта, в вашей системе идентификатор будет иным.
Для проверки работы внешних провайдеров проще всего воспользоваться упомянутой ранее программой 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 была рассмотрена в данной статье.
Добрый день.
Пробовал загружать в систему сертификаты по ГОСТ 2012, но у них не определяется владелец. Из-за чего их не сохранить в системе. Не пробовали грузить такие сертификаты?
Добрый день!
Стандартная криптографическая библиотека насколько я знаю не работает с ГОСТ-ом, варианты мне кажется следующие:
1. Писать расширение для неё (вроде как SAP даёт для этого API),
2. Написать некое решение (например на Java) или использовать OpenSSL, запуская это все на сервере приложения (сертификаты хранятся там же).
3. Использовать стороннее решение, которое либо расширяет библиотеку способом из п.1, либо предоставляет SSF интерфейс через RFC вызовы (для SAP GUI).
Добрый день.
Тут именно проблема в получении информации о сертификате в SAP. Приходиться использовать ole-утилиту для получения хоть какой-то информации о сертификатах в личном хранилище пользователя. А у нее тоже весьма ограниченные функции.
Хотя есть вот такая программа SSFSDEMO, которая каким-то способом получает данные о сертификатах.
Указанная программа использует OLE объект SAPSIGN.SAPSignCtrl.1, но среди его методов нет отдельных методов чтения данных об установленных сертификатах.
Можно через какой-нибудь PowerShell получить информацию о сертификатах: https://ilovepowershell.com/2015/03/20/looking-at-installed-certificates-with-powershell/
Добрый день!
Спасибо за статью!
Вы не сталкивались с шифрованием данных через SAPSECULIB?
Настроил по статье — все хорошо (шифрует-расшифровывает), но не просит private key пароль для расшифровки.
Хотелось бы чтобы просил 🙂
В OpenSSL делал пароль для *.pem, да и в STRUST выбрал галочку Always require password.
Если пытаюсь ввести левый пароль в SSF02 — не работает, с пустым паролем ОК.
Значит настраивает пароль как пустой.
По дебагу SSF02 вообще — если RFC пусто то пароль не нужен.
Начинаю думать, что дело в библиотеке и нужна SAPCRYPTOLIB
Добрый день!
К сожалению, или к счастью, с такой проблемой не сталкивался.
>Настройка выполняется в файле ssfrfc.ini.
А где должен находиться файл ssfrfc.ini?
https://help.sap.com/viewer/cf1026f0534f408e849ee7feed288a66/7.51.1/en-US/254e0b37cf3e3273e10000009b38f936.html
The default name of the SSF initialization file is ssfrfc.ini and the file is in the same directory as the SSF RFC server program ssfrfc.exe. In a standard installation, this is the SAP GUI directory.
Добрый день! Подскажите, пожалуйста, какие есть способы вытащить ID сертификата при использовании функции ssf ? (для штампа требуется Номер сертификата)
Добавлю, в ssf.ini параметр CP_SSF_USERID=CERT_HASH, но требуется номер сертификата, а не отпечатка, значение по умолчанию не подходящее
Добрый день!
подскажите, можно ли используя SSF выполнять подписание с помощью внешнего крипто провайдера, расположенного на отдельном сервере? при этом закрытая часть у пользователя на флешке, а сертификат может быть установлен предварительно на сервер.
Спасибо!