Статус: Участник
  Группы: Участники
 Зарегистрирован: 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