logo Обзор КриптоПро NGate для защищённого доступа к корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

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

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

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

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

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 8,437
Мужчина

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

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

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


ICertificate2::Save method

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

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 8,437
Мужчина

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


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


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

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 8,437
Мужчина

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

Цитата:

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



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

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 8,437
Мужчина

Сказал «Спасибо»: 300 раз
Поблагодарили: 1186 раз в 929 постах
Автор: 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)
Сообщений: 3
Российская Федерация

Сказал(а) «Спасибо»: 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) загружен 3 раз(а).

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

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

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

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

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

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

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

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

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