Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Электронный больничный ЭЛН  [new]
delem
Member

Откуда:
Сообщений: 1
День добрый, форумчане!
У кого-то есть решение по интеграции с ЭЛН ФСС под Delphi 7?
Готов приобрести за договорную плату.
Заинтересованным просьба писать в личку или на delem@yandex.ru
2 июн 18, 18:15    [21463222]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 574
Здравствуйте всем!

На Делфи 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:

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

С уважением, Александр.
6 июн 18, 13:31    [21472549]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken,

Могу подсказать...
Почему ГОСТ-2012 используется?
Они уже на нём?
6 июн 18, 16:51    [21473399]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken,

делай тестовый сертификат - ГОСТ-2001 ...
6 июн 18, 16:52    [21473405]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 574
sql2012
Shuraken,

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


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

Я формировал и сертификат с открытым ключом по ГОСТ Р 34.10-2001 (512Bits), но там возникла проблема на этапе формирования хэш-суммы тэга Body, не создаётся хэш.
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 ЭП недействительна.
6 июн 18, 17:39    [21473558]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken,

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

1) Не прописывать имена CSP
2) Использовать правильные типы CSP
3) CALG_GR3410EL - точно он нужен?
6 июн 18, 17:46    [21473579]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken,

2148073480=0x80090008 = "Invalid Algorithm Specified"
6 июн 18, 17:49    [21473586]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken,

CALG_GR3411 = 32798;
6 июн 18, 17:51    [21473593]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken,

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

А хочешь хеш получить (CryptCreateHash)... Вот и не пускает - 2148073480=0x80090008 = "Invalid Algorithm Specified"
6 июн 18, 17:53    [21473602]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
http://cpdn.cryptopro.ru/content/csp40/html/group___pro_c_s_p_ex_DP1.html
6 июн 18, 17:54    [21473606]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
автор
Подставляю вместо CALG_GR3410EL CALG_GR3411 (хоть это и неправильно), тогда всё формируется


Сам придумал?
6 июн 18, 17:55    [21473611]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 574
sql2012
Shuraken,

'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. По крайней мере именно эта константа была прописана в идентификаторах алгоритма криптопровайдера. Говорю же, что подставлял и другие константы для работы что с этим сертификатом, что с другими, и с ними всё работало, но там были другие ошибки, о которых я написал ранее.
6 июн 18, 17:56    [21473615]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 574
sql2012
Shuraken,

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

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


Суть уловил. Сюда надо подставить CALG_GR3411, то же самое сделать и для подписывания SignedInfo, и т.д. Это я делал. Почему же тогда вылезает ошибка при получении ответа от ФСС "ЭЦП неверна. INVALID_SIGNATURE ЭП недействительна."?
6 июн 18, 18:06    [21473652]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken
sql2012
Shuraken,

'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 ... ?
Подбирать можно долго, как и путать алгоритмы хеширования и подписи...
6 июн 18, 18:07    [21473656]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken
sql2012
Shuraken,

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

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


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


У самого получилось проверить то, что отправляешь?
Сторонний софт подтверждает корректность (для начала - хеша)?
6 июн 18, 18:10    [21473662]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 574
sql2012
Не судьба запросить у ОС по имени CSP его тип? Он разве 1 ... ?
Подбирать можно долго, как и путать алгоритмы хеширования и подписи...


1. А как это сделать?
2. Да, согласен, мой косяк. Увидел знакомые цифирки в идентификаторе 34.10-2001, обрадовался и подставил, не обратив внимания, за что он отвечает.
6 июн 18, 18:13    [21473675]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 574
sql2012
У самого получилось проверить то, что отправляешь?
Сторонний софт подтверждает корректность (для начала - хеша)?


До этого ещё не дошёл. Как это можно проверить?
6 июн 18, 18:15    [21473682]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken
sql2012
У самого получилось проверить то, что отправляешь?
Сторонний софт подтверждает корректность (для начала - хеша)?


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


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


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

Далее - корректные ли данные подписываются (из Body).
6 июн 18, 18:21    [21473705]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Еще можно почитать\поискать по ключевым словам (имена функций) на специализированных форумах.

Например, КРИПТО-ПРО.
6 июн 18, 18:22    [21473710]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 602
Shuraken
sql2012
Не судьба запросить у ОС по имени 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;
6 июн 18, 18:36    [21473741]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 574
sql2012,
благодарю за советы. Проверка показала, что данные неправильно подписываются. Потихоньку разбираюсь.
8 июн 18, 10:24    [21478204]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить