Статус: Новичок
Группы: Участники
Зарегистрирован: 25.10.2019(UTC) Сообщений: 4 Сказал(а) «Спасибо»: 1 раз
|
Добрый день. Подскажите, пожалуйста, возможен ли экспорт сертификата с закрытым ключом с носителя через Крипто Про Browser Plugin? Дело в том, что есть рабочий код (подписание, шифрование, дешифрование) для однопользовательской десктопной версии. Но ПО необходимо реализовать в виде веб-приложения, где каждый пользователь должен работать со своей ЭЦП, установленной не на сервере, а на своем клиентском ПК, через Web-браузер. Или возможен ли экспорт не всего закрытого ключа, а лишь информации от него, достаточной для подписания и дешифрования силами сервера (веб-приложения)? Сейчас в коде закрытый ключ извлекается следующим образом: cert.GetPrivateKeyInfo() где cert - X509Certificate2
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,451 Сказал «Спасибо»: 553 раз Поблагодарили: 2235 раз в 1743 постах
|
Здравствуйте. Интерфейс ICPCertificateЦитата: Предоставляет методы для работы с сертификатом открытого ключа. Расширяет интерфейс CAPICOM.Certificate
ICertificate2:: Save methodКод:Certificate.Save( _
ByVal FileName, _
[ ByVal Password ], _
[ ByVal SaveAs ], _
[ ByVal IncludeOption ] _
)
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,451 Сказал «Спасибо»: 553 раз Поблагодарили: 2235 раз в 1743 постах
|
Автор: Alex AD Или возможен ли экспорт не всего закрытого ключа, а лишь информации от него, достаточной для подписания и дешифрования силами сервера (веб-приложения)? Сертификат требуется для поиска соответствующего контейнера с закрытым ключом (PrivateKey). Именно закрытый ключ участвует в процессах подписания\расшифровки. Сертификат не содержит закрытый ключ. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,451 Сказал «Спасибо»: 553 раз Поблагодарили: 2235 раз в 1743 постах
|
Объект CPCertificateЦитата: В отличие от объекта Microsoft CAPICOM.Certificate , для данного объекта реализованы только следующие методы и свойства: Export, Import, GetInfo, HasPrivateKey, IsValid, IssuerName, SerialNumber, SubjectName, Thumbprint, ValidFromDate, ValidToDate, Version, ExtendedKeyUsage, KeyUsage, PublicKey, PrivateKey, BasicConstraints.
Save - отсутствует. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,451 Сказал «Спасибо»: 553 раз Поблагодарили: 2235 раз в 1743 постах
|
Автор: Alex AD Дело в том, что есть рабочий код (подписание, шифрование, дешифрование) для однопользовательской десктопной версии. Но ПО необходимо реализовать в виде веб-приложения, где каждый пользователь должен работать со своей ЭЦП, установленной не на сервере, а на своем клиентском ПК, через Web-браузер. А зачем потребовался экспорт с закрытым ключом? Работайте с сертификатами из плагина, подписывайте\шифруйте\расшифровывайте. |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602 Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 395 раз в 366 постах
|
Добрый день. Как-то внезапно Вы повернули к теме ФСС, хотя есть уже с десяток тем про ФСС. Думаю всем будет легче, если приведете рабочий код шифрования плагином для ФСС. Собственно в Вашем рабочем коде все ответы на Ваш вопрос. Намек: при шифровании вы генерируете сессионный ключ, но при расшифровке получаете его из присланного документа. Зачем же вы в коде для плагина при расшифровке пытаетесь генерировать ключ? Каков шанс что Ваш сгенерированный ключ совпадет с использованным ФСС? Не очень велик, правда?
Получение сеесионного ключа из сообщения по идее автоматическое, но если нет, то используется закрытый ключ получателя (сертификат которого был в запросе на который прислан ответ) и сертификат отправителя для получения ключа согласования и ключом согласования расшифровывается сессионный ключ из сообщения, потом сессионным ключом расшифровывается сообщение. Именно это у Вас сделано в рабочем коде.
P.S. если правильно помню дешифровка это без ключа, а расшифровка с ключом. Отредактировано пользователем 12 ноября 2019 г. 7:31:12(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.01.2023(UTC) Сообщений: 1
|
Добрый день. У меня похожая проблема как и у Alex AD Подскажите, как экспортировать закрытый ключ сертификата через Крипто Про Browser Plugin на сервер?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,451 Сказал «Спасибо»: 553 раз Поблагодарили: 2235 раз в 1743 постах
|
Автор: nikonov_8 Добрый день. У меня похожая проблема как и у Alex AD Подскажите, как экспортировать закрытый ключ сертификата через Крипто Про Browser Plugin на сервер?
экспорт через плагин не реализован |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close