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

Откуда: 74
Сообщений: 104
Добрый день.

Имеется подписанный файл (для удобства чтения отформатированный):
+ подписанный файл
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<SOAP-ENV:Header>
<wsse:Security SOAP-ENV:actor="http://eln.fss.ru/actor/insurer/12345">
<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="http://eln.fss.ru/actor/insurer/12345">
тут сертификат пользователя, подписавшего данные
</wsse:BinarySecurityToken>
<ds:Signature>
<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
<Reference URI="#body">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<DigestValue>тут хеш-сумма тега body</DigestValue>
</Reference>
</SignedInfo>
<ds:SignatureValue>
тут подписанная хеш-сумма тега SignedInfo
</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#http://eln.fss.ru/actor/insurer/12345" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body wsu:Id="body">
<getPrivateLNData xmlns="http://ru/ibs/fss/ln/ws/FileOperationsLn.wsdl">
<regNum>1111111</regNum>
<lnCode>22222222</lnCode>
<snils>123456789</snils>
</getPrivateLNData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Также в наличии имеется 2 сертификата: свой и ФСС.
С вычислением хеш-суммы и подписи разобрался. А вот шифрование не осилил.

Задача: этот подписанный файл зашифровать и поместить в файл:
+ структура зашифрованного файла
<SOAP-ENV:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
Type="http://www.w3.org/2001/04/xmlenc#Content" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:sch="http://gost34.ibs.ru/WrapperService/Schema"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <xenc:EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147"></xenc:EncryptionMethod>
  <ds:KeyInfo>
    <xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
      <xenc:EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001"></xenc:EncryptionMethod>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate></ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
      <xenc:CipherData>
        <xenc:CipherValue></xenc:CipherValue>
      </xenc:CipherData>
    </xenc:EncryptedKey>
  </ds:KeyInfo>
  <xenc:CipherData>
    <xenc:CipherValue>здесь содержимое зашифрованного файла</xenc:CipherValue>
  </xenc:CipherData>
</xenc:EncryptedData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

В документе Спецификация_ЭЛН_Страхователь_v1_1_20171215.doc указано:
KeyInfo – содержит информацию об секретном ключе, сгенерированном для данного информационного взаимодействия (CipherValue) и публичный сертификат пользователя, зашифровавшего данные (X509Certificate)

Собственно вопросы:
1. Что такое "секретный ключ для данного информационного взаимодействия"?
2. Из непонимания (1) следующий вопрос: какими функциями пользоваться и в какой последовательности для шифрования файла.
3. "публичный сертификат пользователя, зашифровавшего данные (X509Certificate)" - эти данные берутся из сертификата ФСС? Ведь шифровать файл надо их ключом?
25 дек 17, 09:17    [21059341]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
Создание и проверка подписи документа XML

Объект CPEnvelopedData

+ форум КРИПТО-ПРО.
25 дек 17, 23:18    [21061778]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

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

Спасибо за ссылки, только они не открываются.

Вот сейчас у меня есть конкретный вопрос: как формируется CipherValue. Тот самый, который "секретный ключ для данного информационного взаимодействия".

По примерам с сайта накидал вот такое:
+
var
  PublicKeyFss, SessionKey, InitVector: TBytes;
  hKey, hAgreeKey, hSessionKey: Cardinal;
  Len, InputDataLen: Cardinal;
  AlgProExport: DWORD;
  KeySpec: DWORD;
begin
  // Загрузка PUBLICKEYBLOB из сертификата ФСС
  PublicKeyFss := GetPublicKeyFss;

  CryptAcquireContext(hProv, ContainerName, CP_GR3410_2001_PROV_A, PROV_GOST_2001_DH, 0);

  // Получение дескриптора закрытого ключа отправителя.
  CryptGetUserKey(hProv, AT_KEYEXCHANGE, hKey);

  // Получение ключа согласования импортом открытого ключа получателя на закрытом ключе отправителя.
  CryptImportKey(hProv, @PublicKeyFss[0], Length(PublicKeyFss), hKey, 0, hAgreeKey);

  // Установление PRO12_EXPORT алгоритма ключа согласования
  AlgProExport := CALG_PRO_EXPORT;
  CryptSetKeyParam(hAgreeKey, KP_ALGID, @AlgProExport, 0);

  // Генерация сессионного ключа.
  CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, hSessionKey);

  //--------------------------------------------------------------------
  // Зашифрование сессионного ключа.
  //--------------------------------------------------------------------

  //--------------------------------------------------------------------
  // Зашифрование сессионного ключа на ключе Agree.
  CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, nil, Len);
  SetLength(SessionKey, Len);
  CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, @SessionKey[0], Len);

  // Определение вектора инициализации сессионного ключа.
  CryptGetKeyParam(hSessionKey, KP_IV, nil, Len, 0);
  SetLength(InitVector, Len);
  CryptGetKeyParam(hSessionKey, KP_IV, @InitVector[0], Len, 0);

  // Зашифрование данных на сессионном ключе.
  InputDataLen := Length(Data);
	CryptEncrypt(hSessionKey, 0, True, 0, nil, Len, InputDataLen);
  if InputDataLen < Len then
    SetLength(Data, Len);
  CryptEncrypt(hSessionKey, 0, True, 0, @Data[0], Len, InputDataLen);


Как, зная SessionKey, InitVector и может быть что-то еще сформировать CipherValue?
28 дек 17, 12:51    [21069603]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
http://cpdn.cryptopro.ru/?url=/content/cades/plugin-samples-sign-xml.html

http://cpdn.cryptopro.ru/?url=/content/cades/class_c_ad_e_s_c_o_m_1_1_c_p_enveloped_data.html
28 дек 17, 16:47    [21070326]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
>CP_GR3410_2001_PROV_A, PROV_GOST_2001_DH

Такого не должно быть в коде,
в 2018 переход на ГОСТ-2012.
28 дек 17, 16:49    [21070329]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
cutecode
Member

Откуда:
Сообщений: 11
Тоже бьюсь над этим вопросом. Начал в сентябре и только к декабрю удалось сделать подпись. И теперь застрял на шифровании.
Я использую C++, openssl и xmlsec1

Если Вам удастся разобраться, буду рад услышать способы вашего решения.


По поводу третьего вопроса
3. "публичный сертификат пользователя, зашифровавшего данные (X509Certificate)" - эти данные берутся из сертификата ФСС? Ведь шифровать файл надо их ключом?

Нет, это ваш сертификат (клиники), в нем содержится открытый ключ, с помощью которого ФСС зашифрует ответное сообщение, а вы расшифруете его вашим закрытым ключом (клиники)

А вот шифровать данные надо открытым ключом ФСС, чтобы он смог расшифровать их своим закрытым ключом
31 дек 17, 04:27    [21075732]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
cutecode
Тоже бьюсь над этим вопросом. Начал в сентябре и только к декабрю удалось сделать подпись. И теперь застрял на шифровании.
Я использую C++, openssl и xmlsec1

Если Вам удастся разобраться, буду рад услышать способы вашего решения.


По поводу третьего вопроса
3. "публичный сертификат пользователя, зашифровавшего данные (X509Certificate)" - эти данные берутся из сертификата ФСС? Ведь шифровать файл надо их ключом?

Нет, это ваш сертификат (клиники), в нем содержится открытый ключ, с помощью которого ФСС зашифрует ответное сообщение, а вы расшифруете его вашим закрытым ключом (клиники)

А вот шифровать данные надо открытым ключом ФСС, чтобы он смог расшифровать их своим закрытым ключом


Мне разобраться?
"Ваш" сертификат?

Что мешает использовать SDK и примеры с форумов?
Нежелание выделить время и взять\найти, лень, непонимание как искать по ключевым словам?

А... Новый Год же...

С наступающим.
31 дек 17, 09:52    [21075791]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
onets
Member

Откуда:
Сообщений: 76
cutecode
Тоже бьюсь над этим вопросом. Начал в сентябре и только к декабрю удалось сделать подпись. И теперь застрял на шифровании. Я использую C++, openssl и xmlsec1

Мда, на .NET я подобное делал для ФССП в 2012-2013 годах за три месяца весь проект. В целом ничего сложного - крипто-про, их примеры и форумы. Были локальные проблемы, типа несовпадения хеш сумм, но все решалось отладкой, вдумчивыми чтением документации и форумов крипто-про. Или как подлезть к этому во внутренностях WCF, чтоб в итоге все заработало.

Насколько я помню:
1. Если через СМЭВ, то два сертификата. Один для СМЭВ, второй для получателя. Нужно зашифровать сообщение-конверт для получателя сертификатом для получателя. Потом вложить его в конверт СМЕВ и зашифровать еще раз сертификатом для СМЭВ. Проблемы были - какой именно вложенный блок шифровать (начиная с какого xml тега) и какой проставлять Reference URI
2. Если напрямую, то по идее один сертификат.

В любом случае библиотека и примеры от крипто-про делали львиную долю работы. Все SignedInfo, DigestValue, SignatureValue проставлялись автоматически. Просто указываешь контент и какой сертификат использовать.

maratvg, cutecode
Попробуйте поискать примеры для делфей и C++ у крипто-про. Не думаю, что вас обделили в этом плане.
31 дек 17, 10:58    [21075821]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

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

ему уже был дан пример из руководства разработчика,
открыть SDK и посмотреть... что же там такого нужно написать на C++... видимо сложно.
31 дек 17, 12:57    [21075921]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
cutecode
Member

Откуда:
Сообщений: 11
Уж поверьте мне - сложно.
ибо вы тут сами пишите всякую "хрень"

например, ели человек пишет
Такого не должно быть в коде, 
в 2018 переход на ГОСТ-2012.

то он не имеет ни какого представления об XML encryption. В шаблоне же XML явно указаны алгоритмы
Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147"
Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001"


А юзер onets вообще не знает разницы между XML Signing и XML encryption.
Автор темы же написал, что он разобрался с подписью, и не может зашифровать.
А onets злорадно описывает, о том как он легко разобрался с подписью и ни слова о шифровании

А .NET вам не C++. Да, на Java и C# есть готовые библиотеки. Но на С++ я не нашел.
Есть куча библиотек, но они ГОСТ-а не понимают.
А на КриптоПро есть пример только с СОМ-объктом, т.е. на Линукс уже работать не будет. И то при условии что установлен MS Office 2003.

Если вы "умники" если такие умные, то я готов вам заплатить если вы мне сделаете это для вас "легкое задание".
Говорите вашу цену.


С Новым Годом
2 янв 18, 04:07    [21078073]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 104
cutecode,

На delphi пока никуда не продвинулся.

На данный момент пользуюсь классами GostEncryptSOAP/GostDecryptSOAP из GostCryptography.dll из набора arm_fss.
Что примечательно, программисты ФСС видимо тоже не делфи не стали это всё реализовывать, раз юзают дотнетовскую длл-ку.
9 янв 18, 13:42    [21089923]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
uranic
Member

Откуда:
Сообщений: 299
Знаю одну успешную реализацию на Delphi, с ноября 2017 все отправляют. Номера ЛН регистрируют и т.п. Вообщем полный цикл
Из сторонних библиотек используется JwaWinCrypt.pas (из JEDI, для доступа к CryptoAPI)

Весь процесс реализации затянулся на 4 месяца. (начали в середине июля, к середине октября были в тестовой эксплуатации).
К сожалению подробностей много рассказать не могу.
9 янв 18, 17:18    [21091020]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Dmitry19891
Member

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

Пытаюсь получить ответ из ФСС Сервис Страхователя с подписанием и шифрованием данных (версия 1.1)
подписываю запрос или подсовываю из примера (руководства), шифрую, вкладываю в бади нового
соап конверта и от ФСС всегда получаю ответ

(com.sun.xml.internal.ws.fault.ServerSOAPFaultException) com.sun.xml.internal.ws.fault.ServerSOAPFaultException: Client received SOAP Fault from server: ru.ibs.cryptoprto.jcp.wrapper.ws.client.generated.CryptoException_Exception: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. class org.w3c.dom.DOMException Please see the server log to find more detail regarding exact cause of the failure.

Использую JCP
Откликнитесь, пожалуйста, кто имел опыт общения с этим сервисом.
19 янв 18, 09:02    [21118698]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Dmitry19891
Member

Откуда:
Сообщений: 2
Разобрался. Я неправильно подписывал сообщение. Теперь другой вопрос, может кто знает
Тестовый Сервис ФСС ответил мне шифрованным сообщением. Я посылал запрос
getPrivateLNData("3103275205", "290195190104", "09365295200") (взял эти регнам,ЭЛН,СНИЛС из примера)
Но расшифровать его я не могу

XMLCipher xmlCipher = XMLCipher.getInstance();
xmlCipher.init(XMLCipher.DECRYPT_MODE, null);
Element encryptedDataElement = (Element) doc2.getElementsByTagNameNS(EncryptionConstants.EncryptionSpecNS,EncryptionConstants._TAG_ENCRYPTEDDATA).item(0);
xmlCipher.setKEK(key);
xmlCipher.doFinal(doc2, encryptedDataElement);

Получаю Exception "No Key Encryption Key loaded and cannot determine using key resolvers"

Это ошибка что неправильный ключ для расшифровки (не тот абонент) или в принципе неправильный объект ключ и он его не загрузил?

Кто знает где для тестового ФСС взять ключ чтобы расшифровать ответ на 3103275205?
24 янв 18, 17:17    [21135327]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anvig
Member

Откуда:
Сообщений: 4
Dmitry19891,
Тоже делаю связь с ФСС сервисом, хотелось бы узнать поподробнее- в чем была ошибка при шифровании ?
Вот уже третий день на все мои потуги ответ мне один-ru.ibs.cryptoprto.jcp.wrapper.ws.client.generated.CryptoException_Exception: Error in execution of data crypting operation. class org.apache.xml.security.encryption.XMLEncryptionException
Если не трудно опишите, пожалуйста, поподробнее какой режим шифрования выбирали, какие параметры устанавливали.И если уж совсем набраться наглости, то можете выложить оба зашифрованных файл(запрос и ответ от сервиса) ?
А по поводу Вашего вопроса , насколько я понимаю, ключ от ФСС Вы уже получили в ответе.
Вы должны его загрузить к себе и расшифровать свои закрытым ключом.
25 янв 18, 20:39    [21139816]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
cutecode
Member

Откуда:
Сообщений: 11
вот еще 4 недели прошло, и пока все глухо. "Танцы с бубном" не помогают.
Пока только понял следующее, может кто поправит

1. генерируем 8 байт IV
2. генерируем 32 байт сессионного ключа
3. c помощью IV и сессионного ключа шифруем данные алгоритмом ГОСТ 89
4. к полученным зашифрованным данным добавляем префикс из IV (8 байт)
5. из последнего делаем 64encoding и записываем в XML файл
6. шифруем сессионный ключ, открытым ключом ФСС алгоритмом ГОСТ 2001
7. из последнего делаем 64encoding и записываем в XML файл
25 янв 18, 22:53    [21139978]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anvig
Member

Откуда:
Сообщений: 4
Я, конечно, не спец в этом вопросе, потому что за весь январь мне так и не удалось послать шифрованное сообщение. Единственное мое достижение -сервис ФСС перестал материться на мой ключ, теперь ошибка в шифровании данных ) Но, по-моему, алгоритм не такой, как Вы написали
1.генерится сессионый ключ с IV с алгид Гост 89
2.на основе открытого ключа ФСС генерится ключ согласования с алгоритмом ГОСТ 2001
3. сессионный ключ шифруется полученным ключом согласования
4.данные шифруются уже зашифрованным ключом, потом в base64 и в XML
5.в XML ключ ложится в base64, но не по простому, а в виде структуры , описанной в госте 89
Поправьте, если я ошибаюсь. Так достало уже, от ФСС помощи никакой, с техподдержкой хрен свяжешься
26 янв 18, 21:28    [21142818]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
cutecode
Member

Откуда:
Сообщений: 11
Это вы как я понял по примерам КриптоПро рассуждаете? я вообще не понимаю причом там ключ согласования.

Cогласно описанию
https://tools.ietf.org/html/draft-chudov-cryptopro-cpxmldsig-08
 An example of a GOST 28147-89 xenc:EncryptionMethod node is:


     <xenc:EncryptionMethod dsig:Algorithm=
         "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147">
       <!-- id-Gost28147-89-CryptoPro-A-ParamSet -->
       <cpxmlsec:Parameters28147>urn:oid:1.2.643.2.2.31.1<
       /cpxmlsec:Parameters28147>
     </xenc:EncryptionMethod>

   256-bit key, 64-bit Initialization Vector (IV), and optional
   parameters are used in GOST 28147-89 encryption algorithm.  The
   resulting cipher text is prefixed by the IV.  If included in XML
   output, it is then base64 encoded.


В SOAP сообщении, данным обязательно должен предшествовать IV (8 bites)

Я пробовал всунуть туда IV через криптоПро, один "хрен", даже на ключ ругается ФСС.
А вот через openssl удалость зашифровать ключ, но на данные ругается.
Причом через Openssl делал без всяки там "ключей согласования"
27 янв 18, 00:31    [21143172]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anvig
Member

Откуда:
Сообщений: 4
cutecode,
За этот месяц что только не было прочитано, ваш документ тоже читала.
Я так понимаю, что у нас 2 задачи:зашифровать по госту 89(urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147)
и положить в Cipher ключа по госту 2001(urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001)
Шифровать:
уже не помню откуда вычитала, но там говорилось, что если просто генерить сессионный ключ по госту 89, то он получается всегда одинаковый.И поэтому он , в свою очередь , должен зашифрован ключом по госту2001.Причем параметры ключа должны совпадать с параметрами ключа получателя, т.е. открытого ключа ФСС
Получается , что ключ согласования должен быть тоже сгенерен.Если найду снова этот документ, кину ссылку. А на криптопро в потверждении моей теории -https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=12611

Положить ключ в Cipher: чтобы доставить ключ, он должен быть представлен в виде структуры GostR3410-KeyTransport.Опять же на каком-то форуме нашла ответ ФСС, перевела ключ в ASN, увидела , что она полностью соотвествует
структуре GostR3410-KeyTransport
А по поводу вставки IV вообще не поняла,судя по стандарту надо к зашифрованным данным добавить вперед 8 байт IV, а если посмотреть файл , приложенный в https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=87721
там ничего в сами данные не вставлено.
В любом случае, с IV или без него, у меня рез-т одинаковый.Ключ принимается, данные-нет. Возможно, что надо другой режим шифрования указать, отличный от дефолта, или доп параметры какие. Или я вообще не права,хз
27 янв 18, 16:21    [21143811]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
cutecode
Member

Откуда:
Сообщений: 11
вы писали, что вам удалось зашифровать сессионный ключ, можете поделиться кодом?
мой email stomatolog99@ mail.ru
29 янв 18, 02:36    [21145910]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anvig
Member

Откуда:
Сообщений: 4
а смысл? раз данные не расшифровываются(Error in execution of data crypting operation), значит, несмотря на то, что ключ принимается ФСС, он все равно неправильный(
Потому что в шифровании данных ошибку сделать сложно, там всего одна команда.Будет чем реально поделиться, поделюсь.
Может и прав был maratvg,когда ушел на Net.Вот только задача у меня-написать на С++
29 янв 18, 21:41    [21148894]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Павел Ишенин
Member

Откуда: Красноярск
Сообщений: 358
Кто-либо продвинулся в теме шифрования больничных?

Подписание у нас тоже сделано в web. А вот на шифровании ровно теже вопросы.
9 фев 18, 11:20    [21179170]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
tamerlan00
Member

Откуда:
Сообщений: 26
maratvg
cutecode,

На delphi пока никуда не продвинулся.

На данный момент пользуюсь классами GostEncryptSOAP/GostDecryptSOAP из GostCryptography.dll из набора arm_fss.
Что примечательно, программисты ФСС видимо тоже не делфи не стали это всё реализовывать, раз юзают дотнетовскую длл-ку.


Тоже использую эту библиотеку, но не смог найти таких классов GostEncryptSOAP/GostDecryptSOAP.
Я использовал класс GostEncryptedXml. Смог зашифровать и расшифровать своими ключами.
Также смог зашифровать, отправить на тестовый контур и получить зашифрованный ответ. Но не смог расшифровать =(
Бьюсь уже день.
Можете мне код (шифровки/дешифровки сообщения) выслать на почту alex_rpg@list.ru?
31 май 18, 16:52    [21458267]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 104
tamerlan00,

В тот-то и удобство класса GostEncryptSOAP, что у него есть метод:
function encryptMsg(const pProvName: WideString; const pCertName: WideString; const pSOAPMsg: WideString): WideString; 
которому надо отдать имя провайдера, имя сертификата и подписанный xml в виде строки. В ответ он вернет зашифрованный xml.

То же самое с GostDecryptSOAP:
function decryptMsg(const pProvName: WideString; const pSOAPMsg: WideString): WideString;
1 июн 18, 08:28    [21459636]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
tamerlan00
Member

Откуда:
Сообщений: 26
maratvg
tamerlan00,

В тот-то и удобство класса GostEncryptSOAP, что у него есть метод:
function encryptMsg(const pProvName: WideString; const pCertName: WideString; const pSOAPMsg: WideString): WideString; 
которому надо отдать имя провайдера, имя сертификата и подписанный xml в виде строки. В ответ он вернет зашифрованный xml.

То же самое с GostDecryptSOAP:
function decryptMsg(const pProvName: WideString; const pSOAPMsg: WideString): WideString;


Ой, точно. Уже недели 2 копаюсь в GostCryptography, а GostCryptography.SOAP не замечал )))
Спасибо, буду пробовать ))
1 июн 18, 08:55    [21459684]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
delem
Member

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

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

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

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

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

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

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

Откуда:
Сообщений: 588
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

Откуда: РФ
Сообщений: 652
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

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

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

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

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

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

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

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

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

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


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

Откуда:
Сообщений: 588
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

Откуда:
Сообщений: 588
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

Откуда: РФ
Сообщений: 652
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

Откуда: РФ
Сообщений: 652
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

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


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

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


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

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


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


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


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

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

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

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

Откуда: РФ
Сообщений: 652
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

Откуда:
Сообщений: 588
sql2012,
благодарю за советы. Проверка показала, что данные неправильно подписываются. Потихоньку разбираюсь.
8 июн 18, 10:24    [21478204]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
GreyGoblin
Member

Откуда:
Сообщений: 1
Anvig, если еще проблема не решена, то попробуйте развернуть байты iv перед установкой его в начале пакета данных.
27 июн 18, 14:43    [21525323]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
tkolomiets
Member

Откуда:
Сообщений: 6
Кому интересно, выложил архив с вызовом сервиса ФСС шифрованного.
Так же промаялся, таки победил. Тут, вроде как размер ограничен для аттачей, кидаю ссыль на форум крипто-про, там в 8 посте архив
https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=14192
17 июл 18, 10:43    [21576968]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
tkolomiets
Member

Откуда:
Сообщений: 6
https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=93288#post93288
ссыль на пост
17 июл 18, 10:44    [21576975]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
Удалось разобраться с технической частью, сформировать корректный запрос и отправить его. Теперь, как водится, идут нюансы, над которыми подозреваю, придётся серьёзно попотеть.

Допустим ЭЦП формируется сертификатом с таким алгоритмом подписи: ГОСТ Р 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"/>

И сейчас я пытаюсь найти, где эти параметры зашиты, чтобы при формировании запроса их корректно подставлять.
13 авг 18, 12:56    [21640251]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Док
Member

Откуда: Казань
Сообщений: 5874
Shuraken,

хорошо бы опыт в бложике каком выложить. Я бы себе заныкал...
13 авг 18, 17:40    [21640912]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
Док,
так он уже давно выложен на форуме криптопро. Посмотрите предыдущие сообщения в теме.
14 авг 18, 11:06    [21641483]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Док
Member

Откуда: Казань
Сообщений: 5874
Shuraken
Посмотрите предыдущие сообщения в теме.

а-а-а, точно, запамятовал :)
14 авг 18, 18:18    [21642290]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
Столкнулся с такой непонятной для меня ситуацией. Установил несколько тестовых сертификатов от КриптоПро, чтобы проверить корректность наложения ЭЦП. В одном сертификате такие параметры:
Алгоритм подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит
Хэш-алгоритм подписи: ГОСТ Р 34.11-2012 256 бит
Открытый ключ: ГОСТ Р 34.11-2012 512 бит

В другом
Алгоритм подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит
Хэш-алгоритм подписи: ГОСТ Р 34.11-2012 256 бит
Открытый ключ: ГОСТ Р 34.11-2012 256 бит

Я сперва посчитал, что раз в обоих случаях алгоритм подписи и хэш-алгоритм подписи одинаковы, то для формирования хэша будет использоваться один и тот же алгоритм - CALG_GR3411_2012_256 (32801). Ага, щаз. В случае использования второго сертификата с открытым ключом на 256 бит это было справедливо. А вот для сертификата с открытым ключом в 512 бит опытным путём удалось установить, что надо использовать другой алгоритм - CALG_GR3411_2012_512 (32802). Тогда всё накладывается корректно и запрос получается правильным.
И я сейчас пытаюсь понять, как программно вытащить информацию о правильном хэш-алгоритме.

  repeat
    pCertContext := CertEnumCertificatesInStore(hStoreHandle, pCertContext);
    if (pCertContext <> nil) then
    begin
      pSignerCert := CertDuplicateCertificateContext(pCertContext);
      if not CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, nil, @cbSize) then
        continue;
      if (cbSize < 1) then
        continue;
      GetMem(pInfo, cbSize);
      CertGetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, pInfo, @cbSize);
      // из pInfo запоминаю pInfo^.pwszProvName и pInfo^.dwProvTyp
     // алгоритм пытаюсь вытащить так
     pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SignatureAlgorithm.pszObjId), 0);
     AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3411_2012_256 (32801) сам pszOID = 1.2.643.7.1.1.3.2
     pOidInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(pSignerCert^.pCertInfo.SubjectPublicKeyInfo.Algorithm.pszObjId), 0);
     // здесь у pOidInfo pszOID = 1.2.643.7.1.1.1.2, что соответствует группе { CRYPT_PUBKEY_ALG_OID_GROUP_ID  } и константе в ней szOID_CP_GOST_R3410_12_512 (взято из wincryptex)
     AlgID := CertOIDToAlgId(pOidInfo^.pszOID); // получаю CALG_GR3410_12_512 (11837) а надо CALG_GR3411_2012_512 (32802)
    // запоминаю нужные данные
    ....
  until (pCertContext = nil);

И я понимаю, что ищу не то, что надо искать данные именно для хэш-алгоритма, но при этом не могу понять, какими процедурами это можно сделать, используя контекст конкретного сертификата. Подскажите пожалуйста.
С уважением, Александр.
17 авг 18, 10:46    [21645600]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
Также столкнулся с ситуацией, что не работает формирование ЭЦП в Windows 10

type
  TByteArray = array of Byte;

function TfrmSignatureFromCertificate.GetSignature(CanonText: string;
  Cert: PCCERT_CONTEXT; AlgID: integer): string;

var
  Prov: HCRYPTPROV;
  Hash: HCRYPTHASH;
  BufLen: DWORD;
  keySpec: DWORD;
  callerFree: BOOL;
  sigData, reversedData: TByteArray;

  function ReversedBytes(const ABytes: TByteArray): TByteArray;
  var
    I: Integer;
    P: Windows.PByte;
  begin
    SetLength(Result, Length(ABytes));
    P := Windows.PByte(Result);
    for I := Length(ABytes) - 1 downto 0 do
    begin
      P^ := ABytes[I];
      Inc(P);
    end;
  end;

begin
  Result:='';
  KeySpec := 0;

  if (not CryptAcquireCertificatePrivateKey(Cert,
    CRYPT_ACQUIRE_COMPARE_KEY_FLAG, nil, @Prov, @keySpec, @callerFree)) or (not callerFree) then
  begin
    raise Exception.Create('CryptAcquireCertificatePrivateKey');
  end;

  CryptCreateHash(Prov, algID, nil, 0, @Hash);
  CryptHashData(Hash, PByte(CanonText), Length(CanonText), 0);
  BufLen:=0;
  CryptSignHash(Hash,keySpec,nil,0,nil,@BufLen); // и вот здесь получаю отлуп. BufLen = 0;
  if BufLen>0 then
  begin
    SetLength(sigData, BufLen);
    CryptSignHash(Hash,keySpec,nil,0, PByte(sigData),@BufLen);
  end;
  ReversedData := ReversedBytes(sigData);
  SetLength(Result, BufLen);
  Move(PByte(ReversedData)^, PByte(Result)^, BufLen);
  CryptDestroyHash(Hash);
  CryptReleaseContext(Prov,0);
end;


На версиях ниже 10 всё работает нормально. Подскажите, в чём может быть дело?
20 авг 18, 17:09    [21648446]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

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

GetLastError для CryptHashData что-то же сообщает?
На ошибки проверки кто будет писать?

p.s. raise Exception.Create - сильно... GetLastError не угодил?
20 авг 18, 22:49    [21648731]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

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

CryptHashData - всё нормально. Пробовал и GetLastError - возвращает "Неправильный вызов функции" на CryptSignHash. При этом на других версиях винды всё нормально.

Exception.Create ставил для отладки, чтобы видеть, в каких функциях происходили ошибки. Так их быстрее отыскивать.
21 авг 18, 10:40    [21649053]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

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

по-твоему должны все гадать, что у тебя там в переменных?

CSP какой?
21 авг 18, 12:42    [21649309]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

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

CSP - Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
AlgID - CALG_GR3411 (32798)

Тот же результат и для
CSP - Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
AlgID - CALG_GR3411_2012_256 (32801)
21 авг 18, 13:40    [21649468]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

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

CryptSignHash - второй параметр - "за что отвечает" и почему прошит в коде 0?

пример:
https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=91520#post91520



p.s.
Если пишешь на форуме КРИПТО-ПРО и чтобы там отвечали - пиши с проверкой результата каждой функции
+ код ошибки.
21 авг 18, 19:19    [21649914]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

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

Он проинициализирован в ноль. После вызова функции CryptAcquireCertificatePrivateKey он принимает значение 1 - AT_KEYEXCHANGE. За ссылку спасибо.
...
Немного подправил, всё равно та же самая ошибка на Windows 10 - "Неверный вызов функции". Такое чувство, что подписывание на Windows 10 осуществляется как-то по-другому, чем на других версиях.
22 авг 18, 10:57    [21650415]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

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

Он проинициализирован в ноль. После вызова функции CryptAcquireCertificatePrivateKey он принимает значение 1 - AT_KEYEXCHANGE. За ссылку спасибо.
...
Немного подправил, всё равно та же самая ошибка на Windows 10 - "Неверный вызов функции". Такое чувство, что подписывание на Windows 10 осуществляется как-то по-другому, чем на других версиях.


Код ошибки?
22 авг 18, 22:58    [21651310]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

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

сборка CSP какая? последняя?
22 авг 18, 23:00    [21651311]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
sql2012,
Разобрались. Дело было не в версии Windows и не в моей программе. Просто истекла лицензия. Продлили и всё заработало.
27 авг 18, 10:09    [21654610]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
обычно:
0x8007065b (1627) - Ошибка исполнения функции

+ периодически CSP показывает диалог на ввод лицензии, если не вызывать явно в silent-режиме.
27 авг 18, 15:16    [21655092]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
fssinfected
Member

Откуда:
Сообщений: 3
Коллеги, сталкивались ли вы на тестовом контуре https://docs-test.fss.ru/ws-insurer-crypto-v11/FileOperationsLnPort с ошибкой:

ru.ibs.cryptoprto.jcp.wrapper.eln.ws.client.generated.CryptoException_Exception: The prefix "soapenv" for element "soapenv:Body" is not bound. class org.apache.xml.security.encryption.XMLEncryptionException

На просто подписанное сообщение без шифрования сервис https://docs-test.fss.ru/ws-insurer-v11/FileOperationsLnPort отвечает нормально. При попытке использовать с шифрованием вот такая проблема, на стороне ФСС расшифрование проходит, а дальше вот такая история с пространством имён...

Куда бы вы копали?
29 окт 18, 11:59    [21717835]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
fssinfected
Member

Откуда:
Сообщений: 3
Еще одна жертва этих же граблей:



истина где-то рядом :)
1 ноя 18, 10:52    [21721203]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
fssinfected
Member

Откуда:
Сообщений: 3
Уппс, ссылку неправильно вставил: http://www.cyberforum.ru/web-services-wcf/thread1807834.html
1 ноя 18, 10:55    [21721207]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anatole
Member

Откуда:
Сообщений: 3
maratvg,

Добрый день. Вам удалось использовать библиотеку из состава arm_fss? Я пытался вызвать ее на C#, но получаю error exception.
20 ноя 18, 13:19    [21739035]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 104
Anatole,

Про шарп сказать ничего не могу. Подключал к делфи. Всё работало
21 ноя 18, 06:41    [21739645]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anatole
Member

Откуда:
Сообщений: 3
maratvg,

а могли бы показать, как Вы реализовали эти вызовы в delphi. м.б. скинете фрагмент кода напрямую abakkav@yandex.ru
21 ноя 18, 09:27    [21739703]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 104
Anatole,

1. сгенерить из GostCryptography.dll GostCryptography_TLB.pas (TlbExp.exe, tlibimp.exe).
2. в GostCryptography_TLB.pas будут созданы классы TGostEncryptSOAP, TGostDecryptSOAP, которые собственно и использовались.
+ для примера
function EncryptSOAP(const ASignedXml: WideString; const ACertName: string): WideString;
var
  GostEncryptSOAP: TGostEncryptSOAP;
begin
  GostEncryptSOAP := TGostEncryptSOAP.Create(nil);
  try
    GostEncryptSOAP.Connect;
    Result := GostEncryptSOAP.encryptMsg(CP_GR3410_2001_PROV_A, ACertName, ASignedXml);
  finally
    GostEncryptSOAP.Free;
  end;
end;
21 ноя 18, 15:15    [21740223]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Anatole
Member

Откуда:
Сообщений: 3
maratvg,

Спасибо, за разъяснение, идея понятна.
Примерно тоже самое пытался делать и я, но наконец-то понял, что Вы говорите о библиотеке для организации страхователя (из arm_fss), а я пытаюсь использовать библиотека для медицинской организации (из fss_mo). Возможно, здесь какие-то нюансы. Буду пытаться пробиться дальше.

Да, еще вопрос, a aCertName - это "Фонд социального страхования Российской Федерации" или имя файла *.cer
22 ноя 18, 07:39    [21740768]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

Откуда: 74
Сообщений: 104
aCertName - это "Фонд социального страхования Российской Федерации". , т.е. то самое имя, которое прописано в сертификате.
22 ноя 18, 13:09    [21741211]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
maratvg,

А Вы не могли бы выложить сюда, или прислать мне на почту GostCryptography_tlb.pas? Дело в том, что у меня не получается сгенерировать его с помощью tlibimp из ARM_FSS\GostCryptography.dll - выдаёт ошибку. При этом, когда я пытаюсь посмотреть "внутренности" длл-ки с помощью tdump.exe, то не вижу в нём нужного функционала.
+
Turbo Dump Version 5.0.16.12 Copyright (c) 1988, 2000 Inprise Corporation
Display of File GOSTCRYPTOGRAPHY.DLL

Old Executable Header

DOS File Size 31400h (201728. )
Load Image Size 450h ( 1104. )
Relocation Table entry count 0000h ( 0. )
Relocation Table address 0040h ( 64. )
Size of header record (in paragraphs) 0004h ( 4. )
Minimum Memory Requirement (in paragraphs) 0000h ( 0. )
Maximum Memory Requirement (in paragraphs) FFFFh ( 65535. )
File load checksum 0000h ( 0. )
Overlay Number 0000h ( 0. )

Initial Stack Segment (SS:SP) 0000:00B8
Program Entry Point (CS:IP) 0000:0000


Portable Executable (PE) File

Header base: 00000080

CPU type 80386
Flags 2102 [ executable linenumbers symbols backwards 32bit library ]
DLL flags 8540 [ ]
Linker Version B.0
Time stamp 56B473B9 : Fri Feb 05 13:04:41 2016
O/S Version 4.0
User Version 0.0
Subsystem Version 4.0
Subsystem 0003 [ Windows character ]
Object count 00000003
Symbols offset 00000000
Symbols count 00000000
Optional header size 00E0
Magic # 10B
Code size 00030C00
Init Data size 00000600
Uninit Data size 00000000
Entry RVA 00032B7E
Image base 10000000
Code base 00002000
Data base 00034000
Object/File align 00002000/00000200
Reserved 00000000
Image size 00038000
Header size 00000200
Checksum 00000000
Stack reserve/commit 00100000/00001000
Heap reserve/commit 00100000/00001000
Number interesting RVAs 00000010
Name RVA Size
------------------ -------- --------
Exports 00000000 00000000
Imports 00032B2C 0000004F
Resources 00034000 00000328
Exceptions 00000000 00000000
Security 00000000 00000000
Fixups 00036000 0000000C
Debug 000329F4 0000001C
Description 00000000 00000000
Global Ptr 00000000 00000000
TLS 00000000 00000000
Callbacks 00000000 00000000
Bound Imports 00000000 00000000
Import Addr Table 00002000 00000008
Delayed Imports 00000000 00000000
COM Runtime 00002008 00000048
reserved 00000000 00000000

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 00030B84 00002000 00030C00 00000200 60000020 [CER]
02 .rsrc 00000328 00034000 00000400 00030E00 40000040 [IR]
03 .reloc 0000000C 00036000 00000200 00031200 42000040 [DIR]

Key to section flags:
C - contains code
D - discardable
E - executable
I - contains initialized data
R - readable

******************************************************************************
Section: Import
ImportLookUpTblRVA:00032B54
Time Stamp: 00000000
Forwarder Chain: 00000000 (index of first forwarder reference)

Imports from mscoree.dll
_CorDllMain

******************************************************************************
Section: Resources
Flags: 00000000
Time Stamp: 00000000
Major Version: 0000
Minor Version: 0000

Resources:
Type Name Lang Id
--------------------------------------------
[0 named entries, 1 ID entries]
type: Version (16) (next directory @00000018)

[0 named entries, 1 ID entries]
type: Cursor (1) (next directory @00000030)

[0 named entries, 1 ID entries]
type: Unknown (0) (data @00000048)
Offset: 00034058
Size: 000002D0
Code Page: 00000000
Reserved: 00000000



3 дек 18, 10:26    [21751800]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

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

Видимо вы пропустили первый шаг: TlbExp.exe
4 дек 18, 08:03    [21752561]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
maratvg,

Нет, не забыл, там тоже ошибка
TlbExp : error TX0000 : Невозможно загрузить файл или сборку "file:///C:\FSSRF\A
RM_FSS\gostcryptography.dll" или один из зависимых от них компонентов. Сборка со
здана в более поздней версии среды выполнения чем текущая, и не может быть загру
жена.
4 дек 18, 12:43    [21752796]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

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

Нужно версию SDK более свежую

+
D:\GostCryptography>ft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\TlbExp.exe" D:\GostCryptography\GostCryptography.dll
Microsoft (R) .NET Framework Assembly to Type Library Converter 4.6.1055.0
Copyright (C) Microsoft Corporation. All rights reserved.

Assembly exported to 'D:\GostCryptography\GostCryptography.tlb'

D:\GostCryptography>rogram Files\Microsoft SDKs\Windows\v7.1\Bin\TlbExp.exe" D:\GostCryptography\GostCryptography.dll
Microsoft (R) .NET Framework Assembly to Type Library Converter 3.5.30729.1
Copyright (C) Microsoft Corporation. All rights reserved.

TlbExp : error TX0000 : Невозможно загрузить файл или сборку "file:///D:\GostCryptography\GostCryptography.dll" или один
из зависимых от них компонентов. Сборка создана в более поздней версии среды выполнения чем текущая, и не может быть за
гружена.
4 дек 18, 14:45    [21752991]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
maratvg,

Огромное спасибо, установил.
4 дек 18, 15:26    [21753093]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
maratvg,

правда, там описание функционала отличается от того, что написали Вы. Можете объяснить назначение pSenderCertName (function encryptMsg(const pProvName: WideString; const pCertName: WideString;
const pSenderCertName: WideString; const pSOAPMsg: WideString): WideString;)?
На всякий случай прилагаю архив с моим сгенерированным pas-файлом.

К сообщению приложен файл (GostCryptography.rar - 12Kb) cкачать
4 дек 18, 17:15    [21753412]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

Откуда:
Сообщений: 588
С этим разобрался - взял GostCryptography из папки FssTools, а не ARM_FSS. Правда, теперь там другая проблема: сообщение "Операция не может быть выполнена с текущим ключом", после чего слетают все настройки хранилища сертификатов и приходится перезагружать компьютер. Так что всё весело.
5 дек 18, 11:55    [21754098]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
maratvg
Member

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

Работал только со старой длл-кой, сейчас нет надобности, поэтому что там поменялось не слежу.
5 дек 18, 14:35    [21754421]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
sql2012
Member

Откуда: РФ
Сообщений: 652
Shuraken
С этим разобрался - взял GostCryptography из папки FssTools, а не ARM_FSS. Правда, теперь там другая проблема: сообщение "Операция не может быть выполнена с текущим ключом", после чего слетают все настройки хранилища сертификатов и приходится перезагружать компьютер. Так что всё весело.


Через CSP контейнер (по сертификату) тестируется без проблем?
5 дек 18, 19:35    [21754872]     Ответить | Цитировать Сообщить модератору
 Re: Электронный больничный ЭЛН  [new]
Shuraken
Member

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

в смысле, нормально ли подписывается и принимается ФСС? Да, там всё нормально, но реализовано не через GostCryptography.
6 дек 18, 10:07    [21755402]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Delphi Ответить