Статус: Участник
Группы: Участники
Зарегистрирован: 25.01.2019(UTC) Сообщений: 27 Сказал «Спасибо»: 3 раз Поблагодарили: 9 раз в 3 постах
|
Ну это прям последнее из последних ... Если в процедуре DecryptSOAPResponse все проходит до конца. обрати внимание на CreateDecryptedContent(decryptedData) - тут устранение последствий паддинга и т.п. Если там чтото есть. сохрани на диск и посмотри что там. тут должен быть ответ расшифрованный. Но может оказаться кривой. Т.е. не соответствовать схеме xml и соответственно не подменяться в FssOnAfterExecute. Если все прошло на ура, то дальше идет процедура сохранения ответа на диск responseDoc.SaveToFile('Resp'+MethodName+'Decrypt.xml'); смотри ее. после расшифрованный ответ подсовывается в объявленный сервис, откуда получается номер и выводиться в поле главной формы Edit1.Text := resCryp.data
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.01.2019(UTC) Сообщений: 27 Сказал «Спасибо»: 3 раз Поблагодарили: 9 раз в 3 постах
|
ну точно! я в строке CertUser := GetCertificate(FCryptoProvider, 'твой сертификат'); подсунул сертификат от фсс и получил шифрованный ответ и ошибку "Плохие данные" там на том месте где ты писал. Тут нужно указать ТВОЙ сертификат, не фcc!!! Отредактировано пользователем 21 июля 2021 г. 12:09:10(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.11.2015(UTC) Сообщений: 13 Сказал(а) «Спасибо»: 2 раз
|
Alexcrool, спасибо за терпение :) Запустил скомпилированный exe на рабочей станции коллеги, который имеет реальный сертификат, все сработало. Получаю номер ЭЛН. У меня, с моим тестовым, все еще ругается на "плохие данные". Попробую что-нибудь придумать.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.01.2019(UTC) Сообщений: 27 Сказал «Спасибо»: 3 раз Поблагодарили: 9 раз в 3 постах
|
Очень рад за вас. И ничего тут думать не надо. Иди и сделай себе сертификат с квалифицированной цифровой подписью, все равно пригодиться для подписи. Ну или оформи на организацию для которой делаешь взаимодействие с ФСС. Им она точно понадобиться! Сейчас делают обезличенные сертификаты на юр. лицо (без привязки к ФИО руководителя)
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.11.2015(UTC) Сообщений: 13 Сказал(а) «Спасибо»: 2 раз
|
Возникли трудности с отправкой ЛН на тестовый контур (при помощи prParseFilelnlpuRequest). В ответ получаю две ошибки: - Отсутствует подпись головной организации - Отсутствует ЭП-1 (нарушение режима, стационар)
Правильно ли я понимаю, что для подобного запроса одной моей подписи уже недостаточно и требуется подпись МО? Как это можно обойти в тестовых целях?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.01.2019(UTC) Сообщений: 27 Сказал «Спасибо»: 3 раз Поблагодарили: 9 раз в 3 постах
|
К сожалению дальше получения номера ЭЛН я не разбирался. Но вы правы, для некоторых операций с ЭЛН требуется подпись сертификатом от организации (руководителя). Так же необходим доступ к сертификатам лечащих врачей, которые выписывают БЛ. Для примера установите АРМ ФСС и настройте его на тестовый контур. Так вы сможете увидеть, что будет работать с вашими сертификатами, а что нет и что необходимо указать в настройках АРМ. Тоже самое нужно и для работы вашего ПО
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.09.2021(UTC) Сообщений: 5
|
Пытаюсь адаптировать код взятый от сюда: https://www.cyberforum.ru/web-se...s-wcf/thread2078783.html для шифрования отправляемых сообщений. Вот код: Код:
public XmlDocument EncryptionXML(XmlDocument document, X509Certificate2 fssCertificate, X509Certificate2 clinicCertificate)
{
XmlNode elementBody = document.GetElementsByTagName("Envelope", xmlns_soapenv)[0];
// Создаем новый XML документ.
XmlDocument doc = new XmlDocument();
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("soapenv", xmlns_soapenv);
ns.AddNamespace("xenc", xmlns_xenc);
ns.AddNamespace("ds", xmlns_ds);
ns.AddNamespace("sch", xmlns_sch);
ns.AddNamespace("wsse", xmlns_wsse);
ns.AddNamespace("wsu", xmlns_wsu);
MemoryStream newRequestStream = new MemoryStream();
XmlWriter writer = XmlWriter.Create(newRequestStream, new XmlWriterSettings { Encoding = Encoding.UTF8 });
writer.WriteStartDocument();
/* Envelope */
writer.WriteStartElement("soapenv", "Envelope", xmlns_soapenv);
/* Header */
writer.WriteStartElement("soapenv", "Header", xmlns_soapenv);
writer.WriteEndElement(); // Header
writer.WriteStartElement("soapenv", "Body", xmlns_soapenv); // Body
/************************************************************** EncryptedData **************************************************************************/
writer.WriteRaw(elementBody.OuterXml);
/*******************************************************************************************************************************************************/
writer.WriteEndElement(); // Body
writer.WriteEndElement(); // Envelope
writer.WriteEndDocument();
writer.Flush();
string xmlText = Encoding.GetEncoding("UTF-8").GetString(newRequestStream.ToArray());
XmlDocument xml = new XmlDocument();
newRequestStream.Position = 0;
xml.Load(newRequestStream);
writer.Close();
// Ищем заданный элемент для заширования. Envelope
XmlElement elementToEncrypt = xml.GetElementsByTagName("Envelope", xmlns_soapenv)[1] as XmlElement;
// Создаем объект EncryptedData и заполняем его необходимой информацией.
EncryptedData edElement = new EncryptedData();
edElement.Type = EncryptedXml.XmlEncElementUrl;
// Созданный элемент помечаем EncryptedElement1
//edElement.Id = "EncryptedElement1";
// Заполняем алгоритм зашифрования данных. Он будет использован при расшифровании.
edElement.EncryptionMethod = new EncryptionMethod(CPEncryptedXml.XmlEncGost28147Url);
// Создаем новую ссылку на ключ.
edElement.KeyInfo = new KeyInfo();
// Создаем случайный симметричный ключ.
// В целях безопасности удаляем ключ из памяти после использования.
using (Gost28147CryptoServiceProvider sessionKey = new Gost28147CryptoServiceProvider())
{
// Создаем объект класса EncryptedXml
EncryptedXml eXml = new EncryptedXml();
// Зашифроваем узел на симметричном ключе.
byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, sessionKey, false);
// Зашифровываем сессионный ключ и добавляем эти зашифрованные данные к узлу EncryptedKey.
EncryptedKey ek = new EncryptedKey();
byte[] encryptedKey = CPEncryptedXml.EncryptKey(sessionKey, (Gost3410_2012_256CryptoServiceProvider)fssCertificate.PublicKey.Key);
ek.CipherData = new CipherData(encryptedKey);
ek.EncryptionMethod = new EncryptionMethod(CPEncryptedXml.XmlEncGostKeyTransportUrl);
KeyInfoX509Data data = new KeyInfoX509Data(fssCertificate);
ek.KeyInfo.AddClause(data);
// Добавляем ссылку на зашифрованный ключ к зашифрованным данным.
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));
// Добавляем зашифрованные данные к объекту EncryptedData.
edElement.CipherData.CipherValue = encryptedElement;
}
// Заменяем исходный узел на зашифрованный.
EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false);
return xml;
}
Идея простая: создаем новый xml, в его Body "заливаем" содержимое подписанного отправляемого документа, затем этот Body шифруем и заменяем его на зашифрованный результат. Результат к сожалению не удовлетворительный, ФСС возвращает:"Не удалось расшифровать сообщение. Возможно сообщение зашифровано на ключе отличном от ключа уполномоченного лица ФСС. Проверьте правильность и актуальность ключа уполномоченного лица ФСС." Ихняя ФСС АРМ ЛПУ работает нормально на тестовом сертификате и с шифрованием. Подскажите пожалуйста в какую сторону мне копать?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.09.2021(UTC) Сообщений: 5
|
Коллеги, кто ни будь знает, что означает это в спецификации: " 2. Для ЭП врача: «http://eln.fss.ru/actor/doc/[№ ЭЛН]_[№ подписываемого блока*]_doc 3. Для ЭП председателя ВК: «http://eln.fss.ru/actor/doc/[№ ЭЛН]_[№ подписываемого блока*]_vk "
Имеется ввиду [№ подписываемого блока*]. Подписание у меня работает, но номера блоков зашиты в коде, т.е. могу только отправлять БЛ с конкретным содержанием. Нужен общий подход с генерацией этого номера. Спасибо.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.02.2021(UTC) Сообщений: 1
Сказал(а) «Спасибо»: 1 раз
|
При отправке ЛН на тестовый контур (при помощи prParseFilelnlpuRequest), проект который выложил выше Alexcrool. заполняю ЛН так: reqCryp2 := WSLnCryptoV20.prParseFilelnlpuRequest.Create; reqCryp2.ogrn := ogrn; reqCryp2.pXmlFile :=WSLnCryptoV20.pXmlFile.Create; rs:=WSLnCryptoV20.rowset.Create; reqCryp2.pXmlFile.rowset:=rs; rs.author := ''; rs.email := ''; rs.phone := ''; rs.software := 'test'; rs.version := '2.0'; rs.version_software := '2.01.01.2020082103'; SetLength(ARW,1); rs.row:=ARW; rw:=WSLnCryptoV20.row.Create; ARW[0]:=rw; rw.Id := FormatDateTime('yyyy-mm-dd', now); rw.unconditional := False; ну и далее в таком ключе. Получаю raised exception class ESOAPDomConvertError with message 'Must enable multiref output for objects when serializing a graph of objects - (row)'. Как переключить эту самую сериализацию, или как можно выложить данным элементом по другому? Спасибо. Отредактировано пользователем 2 ноября 2021 г. 11:31:33(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 10.11.2017(UTC) Сообщений: 10 Сказал(а) «Спасибо»: 3 раз Поблагодарили: 4 раз в 4 постах
|
На новых версиях CSP перестала работать расшифровка данных. На 5.0.11455 еще работает, c 5.0.12000 и дальше уже нет.
Предположу, что надо другие хитрые байты в APublicKeyBlob и ASessionKeyBlob.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close