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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Alex AD  
#1 Оставлено : 9 ноября 2019 г. 12:57:58(UTC)
Alex AD

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

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

Сказал(а) «Спасибо»: 1 раз
Добрый день.
Подскажите, пожалуйста, возможен ли экспорт сертификата с закрытым ключом с носителя через Крипто Про Browser Plugin?
Дело в том, что есть рабочий код (подписание, шифрование, дешифрование) для однопользовательской десктопной версии. Но ПО необходимо реализовать в виде веб-приложения, где каждый пользователь должен работать со своей ЭЦП, установленной не на сервере, а на своем клиентском ПК, через Web-браузер. Или возможен ли экспорт не всего закрытого ключа, а лишь информации от него, достаточной для подписания и дешифрования силами сервера (веб-приложения)?
Сейчас в коде закрытый ключ извлекается следующим образом:
cert.GetPrivateKeyInfo()
где cert - X509Certificate2
Offline Андрей Писарев  
#2 Оставлено : 9 ноября 2019 г. 16:15:26(UTC)
Андрей *

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

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

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

Интерфейс ICPCertificate
Цитата:

Предоставляет методы для работы с сертификатом открытого ключа. Расширяет интерфейс CAPICOM.Certificate


ICertificate2::Save method

Код:
Certificate.Save( _
  ByVal FileName, _
  [ ByVal Password ], _
  [ ByVal SaveAs ], _
  [ ByVal IncludeOption ] _
)
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#3 Оставлено : 9 ноября 2019 г. 16:18:31(UTC)
Андрей *

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

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

Сказал «Спасибо»: 495 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: Alex AD Перейти к цитате
Или возможен ли экспорт не всего закрытого ключа, а лишь информации от него, достаточной для подписания и дешифрования силами сервера (веб-приложения)?


Сертификат требуется для поиска соответствующего контейнера с закрытым ключом (PrivateKey).
Именно закрытый ключ участвует в процессах подписания\расшифровки.
Сертификат не содержит закрытый ключ.


Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#4 Оставлено : 9 ноября 2019 г. 16:38:56(UTC)
Андрей *

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

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

Сказал «Спасибо»: 495 раз
Поблагодарили: 2035 раз в 1579 постах
Объект CPCertificate

Цитата:

В отличие от объекта Microsoft CAPICOM.Certificate , для данного объекта реализованы только следующие методы и свойства: Export, Import, GetInfo, HasPrivateKey, IsValid, IssuerName, SerialNumber, SubjectName, Thumbprint, ValidFromDate, ValidToDate, Version, ExtendedKeyUsage, KeyUsage, PublicKey, PrivateKey, BasicConstraints.



Save - отсутствует.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#5 Оставлено : 9 ноября 2019 г. 16:46:33(UTC)
Андрей *

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

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

Сказал «Спасибо»: 495 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: Alex AD Перейти к цитате

Дело в том, что есть рабочий код (подписание, шифрование, дешифрование) для однопользовательской десктопной версии. Но ПО необходимо реализовать в виде веб-приложения, где каждый пользователь должен работать со своей ЭЦП, установленной не на сервере, а на своем клиентском ПК, через Web-браузер.


А зачем потребовался экспорт с закрытым ключом?

Работайте с сертификатами из плагина, подписывайте\шифруйте\расшифровывайте.



Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Alex AD оставлено 09.11.2019(UTC)
Offline Alex AD  
#6 Оставлено : 11 ноября 2019 г. 15:18:03(UTC)
Alex AD

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

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

Сказал(а) «Спасибо»: 1 раз
Удаленный сервис - ФСС.
1. Подписал SOAP-запрос с помощью плагина на клиенте, взял за пример "шифрование по шаблону" из документации к плагину. С использованием тестового контура "только подписание, без шифрования" получаю нормальный ответ из ФСС.
2. Зашифровал запрос на сервере (предварительно переведя оба открытых сертификата в base64 и отправив их на сервер), благо тут закрытый ключ не нужен. Отправляю запрос на тестовый контур ФСС (с подписанием и шифрованием), не получаю никаких ошибок (что говорит о том, что я зашифровал верно), получаю из ФСС зашифрованное сообщение, которое теперь предстоит расшифровать.
3. Расшифровка возможна только с помощью плагина, т.к. только он может получить доступ (ссылку) к контейнеру с закрытым ключом.
Документация к плагину - только на подписание. На расшифровку нет.
Пробовал подглядев в Code.js:

Код:
 function Decrypt(message){
try {
  var errormes = "";

            try {
                var oSymAlgo = cadesplugin.CreateObject("cadescom.symmetricalgorithm");
            } catch (err) {
                errormes = "Failed to create cadescom.symmetricalgorithm: " + err;
                alert(errormes);
                throw errormes;
            }
            oSymAlgo.GenerateKey();
            var oSesKey2 = oSymAlgo.DiversifyKey();
            var EncryptedData2 = oSesKey2.Decrypt(message, 1);
            var result = Base64.decode(EncryptedData2);
            alert("Данные расшифрованы успешно:");
        }
        catch (err) {
            alert("Ошибка при дешифровании данных:" + err);
        }
    }


Получаю: "Ошибка при дешифровании данных: Error: Параметр задан неверно" при работе oSesKey2.Decrypt(message, 1);

Рабочий код C# по дешифровке:

Код:
public string DecryptXmlDocument(string document, X509Certificate2 myCert)
        {
            // Создаем объект XmlDocument.
            XmlDocument xmlDoc = new XmlDocument();

            // Загружаем XML файл в объект XmlDocument.
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.LoadXml(document);

            // Ищем все зашифрованные данные.
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
            nsmgr.AddNamespace("enc", "http://www.w3.org/2001/04/xmlenc#");
            XmlNodeList list = xmlDoc.SelectNodes("//enc:EncryptedData", nsmgr);

            // Создаем объект EncryptedXml.
            GostEncryptedXml exml = new GostEncryptedXml(xmlDoc);

            if (list != null)
            {
                // Для всех зашифрованных данных.
                foreach (XmlNode node in list)
                {
                    XmlElement element = node as XmlElement;
                    EncryptedData encryptedData = new EncryptedData();
                    encryptedData.LoadXml(element);

                    // Находим подходящий ключ для расшифрования.
                    SymmetricAlgorithm decryptionKey = GetDecryptionKey(encryptedData, myCert);
                    // Находим подходящий ключ для расшифрования.
                    if (decryptionKey == null)
                    {
                        throw new Exception("Ключ для расшифрования сообщения не найден.");
                    }

                    // И на нем расшифровываем данные.
                    byte[] decryptedData = exml.DecryptData(encryptedData, decryptionKey);
                    exml.ReplaceData(element, decryptedData);
                }
            }
            return xmlDoc.OuterXml;
        }

        private static SymmetricAlgorithm GetDecryptionKey(EncryptedData encryptedData, X509Certificate2 myCert)
        {
            IEnumerator encryptedKeyEnumerator = encryptedData.KeyInfo.GetEnumerator();
            // Проходим по всем KeyInfo
            while (encryptedKeyEnumerator.MoveNext())
            {
                // пропускам все что неизвестно.
                KeyInfoEncryptedKey current = encryptedKeyEnumerator.Current as KeyInfoEncryptedKey;
                if (current == null) continue;
                // до первого EncryptedKey
                EncryptedKey encryptedKey = current.EncryptedKey;
                if (encryptedKey == null)
                    continue;
                KeyInfo keyinfo = encryptedKey.KeyInfo;
                // Проходим по всем KeyInfo зашифрования ключа.
                IEnumerator srcKeyEnumerator = keyinfo.GetEnumerator();
                while (srcKeyEnumerator.MoveNext())
                {
                    // пропускам все что неизвестно.
                    KeyInfoX509Data keyInfoCert = srcKeyEnumerator.Current
                        as KeyInfoX509Data;
                    if (keyInfoCert == null)
                        continue;
                    var keyContainer = myCert.GetPrivateKeyInfo();
                    // Приватный ключ, открытый ключ которого мы отправляли при шифровании запроса
                    var privateKey = new Gost_R3410_2012_256_AsymmetricAlgorithm(keyContainer);
                    // Приватный ключ, открытый ключ которого мы отправляли при шифровании запроса
                     Gost_R3410_2012_256_AsymmetricAlgorithm myKey = privateKey as Gost_R3410_2012_256_AsymmetricAlgorithm;
                    if (myKey == null)
                        continue;

                    return GostEncryptedXml.DecryptKey(encryptedKey.CipherData.CipherValue, myKey);
                }
            }
            return null;
        }


Ключ ГОСТ-2012 256 бит.
Сам ответ в виде XML: response_fss.xml (17kb) загружен 7 раз(а).

Как расшифровать плагином?

Отредактировано пользователем 11 ноября 2019 г. 15:18:53(UTC)  | Причина: Не указана

Offline two_oceans  
#7 Оставлено : 12 ноября 2019 г. 7:22:24(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 393 раз в 366 постах
Добрый день. Как-то внезапно Вы повернули к теме ФСС, хотя есть уже с десяток тем про ФСС. Думаю всем будет легче, если приведете рабочий код шифрования плагином для ФСС.

Собственно в Вашем рабочем коде все ответы на Ваш вопрос. Намек: при шифровании вы генерируете сессионный ключ, но при расшифровке получаете его из присланного документа. Зачем же вы в коде для плагина при расшифровке пытаетесь генерировать ключ? Каков шанс что Ваш сгенерированный ключ совпадет с использованным ФСС? Не очень велик, правда?
P.S. если правильно помню дешифровка это без ключа, а расшифровка с ключом.

Отредактировано пользователем 12 ноября 2019 г. 7:31:12(UTC)  | Причина: Не указана

Offline nikonov_8  
#8 Оставлено : 7 февраля 2023 г. 15:02:06(UTC)
nikonov_8

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

Группы: Участники
Зарегистрирован: 27.01.2023(UTC)
Сообщений: 1

Добрый день. У меня похожая проблема как и у Alex AD
Подскажите, как экспортировать закрытый ключ сертификата через Крипто Про Browser Plugin на сервер?
Offline Андрей *  
#9 Оставлено : 10 февраля 2023 г. 10:45:15(UTC)
Андрей *

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

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

Сказал «Спасибо»: 495 раз
Поблагодарили: 2035 раз в 1579 постах
Автор: nikonov_8 Перейти к цитате
Добрый день. У меня похожая проблема как и у Alex AD
Подскажите, как экспортировать закрытый ключ сертификата через Крипто Про Browser Plugin на сервер?


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