powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Электронный больничный ЭЛН
25 сообщений из 196, страница 2 из 8
Электронный больничный ЭЛН
    #39654376
delem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый, форумчане!
У кого-то есть решение по интеграции с ЭЛН ФСС под Delphi 7?
Готов приобрести за договорную плату.
Заинтересованным просьба писать в личку или на delem@yandex.ru
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656451
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!

На Делфи 7 разрабатываю взаимодействие с ФСС. Какие прошёл этапы

1. Через WsdlImp.exe удалось сформировать pas-файл для Сервиса Страхователя с подписанием данных FSSWSInsurer.pas. Немного допилив, проект стал нормально компилиться.
2. Пообщавшись с техподдержкой, удалось получить образцы xml-запросов, посылаемых на сервер ФСС, и ответы от них.
3. Установил VipNet, создал тестовый сертификат для подписывания запросов, установил необходимые корневые сертификаты для создания нужной цепочки.
4. Дальше стал шаманить. Для начала убедился в том, что отправка в ФСС готового запроса из п.2 проходит без каких-либо ошибок, и удаётся получить ответ.
5. А дальше уже идёт сама работа на Делфи. Тестовый сертификат установлен в хранилище "Личное". Параметры.

Алгоритм подписи: ГОСТ Р 34.10/34.11-2001
Хэш-алгоритм подписи: ГОСТ Р 34.11-94
Открытый ключ: ГОСТ Р 34.10-2012/512
Алгоритм отпечатка: sha1

5.1. Открываю локальное хранилище CertOpenStore, через CertEnumCertificatesInStore получаю список всех сертификатов, из которого потом выбираю данный сертификат.
5.2. Функциями CryptAcquireContext, CryptCreateHash, CryptHashData, CryptGetHashParam формирую хэш-сумму тэга Body.
5.3 Функциями CryptAcquireCertificatePrivateKey, CryptCreateHash, CryptSignHash(вычисление размера), CryptSignHash (подписывание хэша) подписываю хэш-сумму тэга SignedInfo, меняю порядок байт на противоположный, кодирую по Base64.
5.4. Далее через Base64 кодирую буфер сертификата pbCertEncoded.

5.5. Всё это вставляется в соответствующие места xml-запроса: <DigestValue></DigestValue>, <SignatureValue></SignatureValue>, <BinarySecurityToken></BinarySecurityToken>, после чего он посылается в ФСС.

И сейчас получаю вот такой ответ:

ORA-20001: Отсутствует подпись головной организации
stacktrace:
Ошибка при проверке ЭЦП. java.security.InvalidKeyException: Invalid key typealgorithm = 1.2.643.7.1.1.1.1, params unparsed, unparsed keybits =
0000: 04 40 5A 22 51 08 50 A1 8C 02 DB 2F F1 40 04 00 .@Z"Q.P..../.@..
0010: 95 6E E6 82 85 FC 88 E4 62 44 D7 FD 66 03 98 0E .n......bD..f...
0020: 24 D1 54 CF 4E FF FF 08 80 C7 A6 EF 82 31 F5 9C $.T.N........1..
0030: C4 21 C4 67 66 27 D8 2E C5 33 90 5E 72 B6 28 1D .!.gf'...3.^r.(.
0040: CF EA ..

stacktrace:

И теперь пытаюсь понять, с чем связана такая ошибка. Может кто-нибудь подсказать?

С уважением, Александр.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656692
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

Могу подсказать...
Почему ГОСТ-2012 используется?
Они уже на нём?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656695
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

делай тестовый сертификат - ГОСТ-2001 ...
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656753
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012Shuraken,

Могу подсказать...
Почему ГОСТ-2012 используется?
Они уже на нём?

Тех.поддержка сказала, что да, они работают с ним.

Я формировал и сертификат с открытым ключом по ГОСТ Р 34.10-2001 (512Bits), но там возникла проблема на этапе формирования хэш-суммы тэга Body, не создаётся хэш.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure GetDigitalValue;
var
  Prov: HCRYPTPROV;
  hash: HCRYPTHASH;
begin
  if not CryptAcquireContext(@Prov,nil,'Infotecs Cryptographic Service Provider',PROV_RSA_FULL,CRYPT_VERIFYCONTEXT) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  try
    if not CryptCreateHash(Prov, CALG_GR3410EL, nil, 0, @hash) then //вот здесь и происходит слом
    begin
     ShowMessage(SysErrorMessage(GetLastError)); //GetLastError=2148073480
     Exit;
   end;

  ......
  finally
     CryptReleaseContext(Prov, 0);
  end;



CALG_GR3410EL взят из wincryptex, равен 11811.

Подставляю вместо CALG_GR3410EL CALG_GR3411 (хоть это и неправильно), тогда всё формируется, но при отправке запроса сервис ФСС возвращает ошибку: ЭЦП неверна. INVALID_SIGNATURE ЭП недействительна.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656759
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

'Infotecs Cryptographic Service Provider', PROV_RSA_FULL
CALG_GR3410EL взят из wincryptex, равен 11811.

1) Не прописывать имена CSP
2) Использовать правильные типы CSP
3) CALG_GR3410EL - точно он нужен?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656762
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

2148073480=0x80090008 = "Invalid Algorithm Specified"
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656766
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

CALG_GR3411 = 32798;
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656770
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shuraken,

CALG_GR3410EL - это идентификатор алгоритма ЭП по ГОСТ Р 34.10-2001.

А хочешь хеш получить (CryptCreateHash)... Вот и не пускает - 2148073480=0x80090008 = "Invalid Algorithm Specified"
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656771
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656773
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПодставляю вместо CALG_GR3410EL CALG_GR3411 (хоть это и неправильно ), тогда всё формируется

Сам придумал?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656774
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012Shuraken,

'Infotecs Cryptographic Service Provider', PROV_RSA_FULL
CALG_GR3410EL взят из wincryptex, равен 11811.

1) Не прописывать имена CSP
2) Использовать правильные типы CSP
3) CALG_GR3410EL - точно он нужен?

1. Имя я прописал здесь, чтобы было понятно, о чём идёт речь. Наверняка это важно. В коде у меня стоит nil и вместо PROV_RSA_FULL стоит 1.
3. По крайней мере именно эта константа была прописана в идентификаторах алгоритма криптопровайдера . Говорю же, что подставлял и другие константы для работы что с этим сертификатом, что с другими, и с ними всё работало, но там были другие ошибки, о которых я написал ранее.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656792
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012Shuraken,

CALG_GR3410EL - это идентификатор алгоритма ЭП по ГОСТ Р 34.10-2001.

А хочешь хеш получить (CryptCreateHash)... Вот и не пускает - 2148073480=0x80090008 = "Invalid Algorithm Specified"

Суть уловил. Сюда надо подставить CALG_GR3411, то же самое сделать и для подписывания SignedInfo, и т.д. Это я делал. Почему же тогда вылезает ошибка при получении ответа от ФСС "ЭЦП неверна. INVALID_SIGNATURE ЭП недействительна."?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656795
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shurakensql2012Shuraken,

'Infotecs Cryptographic Service Provider', PROV_RSA_FULL
CALG_GR3410EL взят из wincryptex, равен 11811.

1) Не прописывать имена CSP
2) Использовать правильные типы CSP
3) CALG_GR3410EL - точно он нужен?

1. Имя я прописал здесь, чтобы было понятно, о чём идёт речь. Наверняка это важно. В коде у меня стоит nil и вместо PROV_RSA_FULL стоит 1.
3. По крайней мере именно эта константа была прописана в идентификаторах алгоритма криптопровайдера . Говорю же, что подставлял и другие константы для работы что с этим сертификатом, что с другими, и с ними всё работало, но там были другие ошибки, о которых я написал ранее.

Не судьба запросить у ОС по имени CSP его тип? Он разве 1 ... ?
Подбирать можно долго, как и путать алгоритмы хеширования и подписи...
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656797
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shurakensql2012Shuraken,

CALG_GR3410EL - это идентификатор алгоритма ЭП по ГОСТ Р 34.10-2001.

А хочешь хеш получить (CryptCreateHash)... Вот и не пускает - 2148073480=0x80090008 = "Invalid Algorithm Specified"

Суть уловил. Сюда надо подставить CALG_GR3411, то же самое сделать и для подписывания SignedInfo, и т.д. Это я делал. Почему же тогда вылезает ошибка при получении ответа от ФСС "ЭЦП неверна. INVALID_SIGNATURE ЭП недействительна."?

У самого получилось проверить то, что отправляешь?
Сторонний софт подтверждает корректность (для начала - хеша)?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656803
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012Не судьба запросить у ОС по имени CSP его тип? Он разве 1 ... ?
Подбирать можно долго, как и путать алгоритмы хеширования и подписи...

1. А как это сделать?
2. Да, согласен, мой косяк. Увидел знакомые цифирки в идентификаторе 34.10-2001, обрадовался и подставил, не обратив внимания, за что он отвечает.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656805
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012У самого получилось проверить то, что отправляешь?
Сторонний софт подтверждает корректность (для начала - хеша)?

До этого ещё не дошёл. Как это можно проверить?
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656811
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shurakensql2012У самого получилось проверить то, что отправляешь?
Сторонний софт подтверждает корректность (для начала - хеша)?

До этого ещё не дошёл. Как это можно проверить?

авторформирую хэш-сумму тэга Body.

Вот это - сохранить в файл, сделать ЭП, проверить, например, через КриптоАРМ.

Далее - корректные ли данные подписываются (из Body).
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656813
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно почитать\поискать по ключевым словам (имена функций) на специализированных форумах.

Например, КРИПТО-ПРО .
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39656822
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shurakensql2012Не судьба запросить у ОС по имени CSP его тип? Он разве 1 ... ?
Подбирать можно долго, как и путать алгоритмы хеширования и подписи...

1. А как это сделать?
2. Да, согласен, мой косяк. Увидел знакомые цифирки в идентификаторе 34.10-2001, обрадовался и подставил, не обратив внимания, за что он отвечает.


Запросить информацию для используемого сертификата

CertGetCertificateContextProperty(Certificate, CERT_KEY_PROV_INFO_PROP_ID, KeyInfo, pcbData)

в KeyInfo будет информация:
авторCRYPT_KEY_PROV_INFO = record
pwszContainerName: LPWSTR;
pwszProvName: LPWSTR;
dwProvType: DWORD;
dwFlags: DWORD;
cProvParam: DWORD;
rgProvParam: PCRYPT_KEY_PROV_PARAM;
dwKeySpec: DWORD;
end;
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39658129
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,
благодарю за советы. Проверка показала, что данные неправильно подписываются. Потихоньку разбираюсь.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39666568
GreyGoblin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anvig, если еще проблема не решена, то попробуйте развернуть байты iv перед установкой его в начале пакета данных.
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39674866
tkolomiets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кому интересно, выложил архив с вызовом сервиса ФСС шифрованного.
Так же промаялся, таки победил. Тут, вроде как размер ограничен для аттачей, кидаю ссыль на форум крипто-про, там в 8 посте архив
https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=14192
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39674871
tkolomiets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Электронный больничный ЭЛН
    #39686815
Shuraken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалось разобраться с технической частью, сформировать корректный запрос и отправить его. Теперь, как водится, идут нюансы, над которыми подозреваю, придётся серьёзно попотеть.

Допустим ЭЦП формируется сертификатом с таким алгоритмом подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит и таким хэш-алгоритмом подписи: ГОСТ Р 34.11-2012 256 бит. В этом случае, в блоке SignedInfo будет такая запись:
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/>
...
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/>

Если же ЭЦП формируется сертификатом вот с такими параметрами:
Алгоритм подписи: ГОСТ Р 34.11/34.10-2001
Хэш-алгоритм подписи: ГОСТ Р 34.11-94

То в блоке SignedInfo будет уже такая структура:

<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411"/>
...
<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411"/>

И сейчас я пытаюсь найти, где эти параметры зашиты, чтобы при формировании запроса их корректно подставлять.
...
Рейтинг: 0 / 0
25 сообщений из 196, страница 2 из 8
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Электронный больничный ЭЛН
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]