Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline alextrof94  
#1 Оставлено : 28 июня 2018 г. 12:32:37(UTC)
alextrof94

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.06.2018(UTC)
Сообщений: 9
Российская Федерация
Откуда: Kazan

Здравствуйте! Проблема, собственно в том, что не могу расшифровать XML от ФСС за неимением приватного ключа их сертификата.

Составляю запрос как описано в этом ответе: https://www.cryptopro.ru...ts&m=90058#post90058
Но, так и не понял как реализовать 4-й пункт ответа, а конкретнее, как заменить сертификат на свой, чтобы ФСС шифровало нашим сертификатом.

Есть два сертификата certOur и certFss, которые совершенно точно хранят то, что в них написано (наш сертификат и ФСС Тестовый, так как используется тестовый контур).
Код:

            // Открываем подписанный файл для шифрования
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load(filename);
            
            // Шифруем сертификатом ФСС
            EncryptedXml eXml = new EncryptedXml();
            EncryptedData edElement = eXml.Encrypt(xmlDoc.DocumentElement, certFss);

            XmlDocument xmlDocEnc = new XmlDocument();
            xmlDocEnc.Load("Source2.xml");

// Чую, по пункту 4 надо в следующих строках что-то поменять, но на что - не понимаю. 
// Пробовал много разных вариантов, обычно сервер возвращает 500 ошибку, кроме вот такого вот способа.
// Тут на самом деле просто идет захардкоженное добавление тегов и пространств имен. 
            xmlDocEnc.DocumentElement.GetElementsByTagName("ds:X509Certificate").Item(0).InnerText =
                edElement.GetXml().GetElementsByTagName("X509Certificate").Item(0).InnerText;
            xmlDocEnc.DocumentElement.GetElementsByTagName("xenc:CipherValue").Item(0).InnerText =
                edElement.GetXml().GetElementsByTagName("CipherValue").Item(0).InnerText;
            xmlDocEnc.DocumentElement.GetElementsByTagName("xenc:CipherValue").Item(1).InnerText =
                edElement.GetXml().GetElementsByTagName("CipherValue").Item(1).InnerText;

            // Сохраняем зашифрованный документ в файле для последующей отправки
            xmlDocEnc.Save(filename3);


Source2.xml


После чего отправляю файл и получаю ответ по адресу:
"https://docs-test.fss.ru/ws-insurer-crypto-v11/FileOperationsLnPort?xsd=2".

Для расшифровки использую пример из CryptoPro "EncryptCerts.cs" (%ProgramFiles(x86)%\Crypto Pro\.NET SDK\Examples\simple\Xml\cs\EncryptCerts.cs).
Все работает до строки в функции "FindMy":
Код:

                AsymmetricAlgorithm alg = store.Certificates[foundN].PrivateKey;

"store.Certificates[foundN].PrivateKey" попросту возвращает NULL у найденного сертификата, и не мудрено.

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

Как заставить ФСС шифровать нашим открытым ключом, чтобы была возможность расшифровать нашим же закрытым ключом?

Отредактировано пользователем 28 июня 2018 г. 12:36:07(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#2 Оставлено : 28 июня 2018 г. 15:25:13(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,330
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2209 раз в 1724 постах
Здравствуйте.

Приложить зашифрованный ответ можете?
И сообщите серийный номер вашего сертификата
Техническую поддержку оказываем тут
Наша база знаний
Offline alextrof94  
#3 Оставлено : 28 июня 2018 г. 16:19:56(UTC)
alextrof94

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.06.2018(UTC)
Сообщений: 9
Российская Федерация
Откуда: Kazan

Автор: Андрей Писарев Перейти к цитате
Здравствуйте.

Приложить зашифрованный ответ можете?
И сообщите серийный номер вашего сертификата


Зашифрованный ответ.


Серийный номер сертификата ФСС:
‎01 d3 fb f6 72 78 c3 c0 00 00 02 fd 03 e8 00 02

Серийник нашего:
‎00 e9 19 b9 e9 f2 40 16 a0 e8 11 57 75 19 16 3b 81
Offline Андрей Писарев  
#4 Оставлено : 28 июня 2018 г. 17:06:33(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,330
Мужчина
Российская Федерация

Сказал «Спасибо»: 549 раз
Поблагодарили: 2209 раз в 1724 постах
То, что отправили - можете приложить?
Цитата:

4. По требованию спецификации необходимо в отправляемом сообщении указать свой публичный сертификат, поэтому заменяем информацию сертификата в узле "/soapenv:Envelope/soapenv:Body/xenc:EncryptedData/ds:KeyInfo/xenc:EncryptedKey/ds:KeyInfo/ds:X509Data/ds:X509Certificate" на свой сертификат (им будет шифроваться ответ от сервера), остальную часть "xenc:EncryptedData" не трогаем.


Вот это не реализовано?
Техническую поддержку оказываем тут
Наша база знаний
Offline alextrof94  
#5 Оставлено : 28 июня 2018 г. 17:33:59(UTC)
alextrof94

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.06.2018(UTC)
Сообщений: 9
Российская Федерация
Откуда: Kazan

Автор: Андрей Писарев Перейти к цитате
То, что отправили - можете приложить?
Цитата:

4. По требованию спецификации необходимо в отправляемом сообщении указать свой публичный сертификат, поэтому заменяем информацию сертификата в узле "/soapenv:Envelope/soapenv:Body/xenc:EncryptedData/ds:KeyInfo/xenc:EncryptedKey/ds:KeyInfo/ds:X509Data/ds:X509Certificate" на свой сертификат (им будет шифроваться ответ от сервера), остальную часть "xenc:EncryptedData" не трогаем.


Вот это не реализовано?


Да, вот этот 4-й пункт не могу понять как сделать.
Пробовал самый простой способ - зашифровал этот же файл нашим сертификатом, и засунул только требуемую секцию в итоговый файл.
Код:

            /* OUR CERT */
            EncryptedXml beXml = new EncryptedXml();
            EncryptedData bedElement = beXml.Encrypt(xmlDoc.DocumentElement, certOur);
            xmlDocEnc.DocumentElement.GetElementsByTagName("ds:X509Certificate").Item(0).InnerText =
                bedElement.GetXml().GetElementsByTagName("X509Certificate").Item(0).InnerText;
            /* END OUR CERT */


Что отсылал для получения ответа, который прикреплен выше:
Offline alextrof94  
#6 Оставлено : 29 июня 2018 г. 22:58:38(UTC)
alextrof94

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.06.2018(UTC)
Сообщений: 9
Российская Федерация
Откуда: Kazan

Так же попробовал вот этот пример (в пустом новом проекте):
http://www.cyberforum.ru/post11868734.html

Но ФСС шифрует, опять же, своим сертификатом.

Поменять сертификат на свой (для примера с того форума и аналогично для изначального примера) пытался и вот так:
Код:

            filename = "s2.xml";
            XmlDocument x = new XmlDocument();
            x.Load(filename);
            x.DocumentElement.GetElementsByTagName("X509Certificate").Item(0).InnerText =
                Convert.ToBase64String(certOur.RawData);
            filename += ".b.xml";
            x.Save(filename);

Отредактировано пользователем 30 июня 2018 г. 6:55:42(UTC)  | Причина: Не указана

Offline alextrof94  
#7 Оставлено : 17 июля 2018 г. 14:48:03(UTC)
alextrof94

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.06.2018(UTC)
Сообщений: 9
Российская Федерация
Откуда: Kazan

Программа, составленная полностью из захардкоженных частей XML файлов, оказалась рабочей. Позже выложу структурированный код программы.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.