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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline mtv06  
#1 Оставлено : 28 декабря 2017 г. 18:42:58(UTC)
mtv06

Статус: Активный участник

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

Добрый вечер! Всё мучаюсь с извлечением закрытого ключа из сертификата.

Цитата:
// Открываем хранилище сертификатов
if (!(hCertStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
CERT_STORE_NAME)))
{
printf("You can not open the vault MY.");
}
else {
printf("open the vault MY.\n");
}

// Получаем указатель на наш сертификат
if (!(pCertContext = CryptUIDlgSelectCertificateFromStore(
hCertStore,
NULL,
NULL,
NULL,
CRYPTUI_SELECT_LOCATION_COLUMN,
0,
NULL)))
{
printf("no change cert. \n");
}
else
{
printf("ok change cert. \n");
}


HCRYPTPROV hCryptProv = NULL;
DWORD dwKeySpecSender;
if (CryptAcquireCertificatePrivateKey(
pCertContext,
0,
NULL,
&hCryptProv,
&dwKeySpecSender,
NULL))
{
printf("dwKeySpecSender - %d.\n", dwKeySpecSender);
printf("The CSP handle has been acquired. \n");
}
else
{
printf("Error during CryptAcquireCertificatePrivateKey.");
}

HCRYPTKEY key = NULL;
if (CryptGetUserKey(hCryptProv, dwKeySpecSender, &key))
{
printf("The CSP handle has been key. \n");
}
else
{
printf("not CSP handle has been key. \n");
}

DWORD cbSize = sizeof(DWORD);
DWORD algId;
DWORD dwKeyId = 0;

CryptGetKeyParam(key, KP_ALGID, (BYTE*)&dwKeyId, &cbSize, 0);


Ключ получил, но как теперь создать X509Certificate2 вот таким образом
Цитата:
X509Certificate2 ^ certX509 = gcnew X509Certificate2((BYTE*)dwKeyId, cbSize);

видел пример http://www.sql.ru/forum/...ata-ne-podderzhivaetsya, там сказано что можно таким образом создать сертификат на основе полученных параметров и дальше уже работать с ним для подписания xml
Цитата:
// Create a new XML document.
XmlDocument^ doc = gcnew XmlDocument;

// Load the passed XML file using its name.
doc->Load(gcnew XmlTextReader("FileName"));

// Create a SignedXml object.
SignedXml^ signedXml = gcnew SignedXml(doc);

// Add the key to the SignedXml document.
//signedXml->SigningKey = Key;
signedXml->SigningKey = certX509->PrivateKey;

Console::WriteLine("SignatureMethod: {0}", signedXml->SignatureMethod);

// Create a reference to be signed.
Reference^ reference = gcnew Reference;
reference->Uri = "";
//reference->DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
//reference->DigestMethod->Insert(0, "http://www.w3.org/2001/04/xmldsig-more#gostr3411");

// Add an enveloped transformation to the reference.
XmlDsigEnvelopedSignatureTransform^ env = gcnew XmlDsigEnvelopedSignatureTransform;
reference->AddTransform(env);

// Add the reference to the SignedXml object.
signedXml->AddReference(reference);

// Compute the signature.
signedXml->ComputeSignature();

Кто сможет подсказать? Подскажите, пожалуйста, что я делаю не так?
Offline Максим Коллегин  
#2 Оставлено : 31 декабря 2017 г. 20:36:33(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,433
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 737 раз в 634 постах
А примеры в КриптоПро .NET SDK не хотите посмотреть?
Знания в базе знаний, поддержка в центре поддержки
Offline mtv06  
#3 Оставлено : 9 января 2018 г. 9:29:20(UTC)
mtv06

Статус: Активный участник

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

смотрел, там пример создания X509Certificate2 с ГОСТ Р 34.11/34.10-2001 не показан

+ если вы имеете этот пример "Пример подписи запроса к сервису СМЭВ и проверки подписи под ответом сервиса", то он требует подключение дополнительных сборок CryptoPro.Sharpei.Xml.dll, которая является платной

вот меня и мучает вопрос возможно ли создать X509Certificate2 по ГОСТ Р 34.11/34.10-2001?

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

Offline Максим Коллегин  
#4 Оставлено : 9 января 2018 г. 10:31:47(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,433
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 737 раз в 634 постах
Кажется, что вам не хватает фундаментальных знаний. Сертификат обычно создает и подписывает УЦ. Почитайте про PKI.
Знания в базе знаний, поддержка в центре поддержки
Offline mtv06  
#5 Оставлено : 9 января 2018 г. 11:13:00(UTC)
mtv06

Статус: Активный участник

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

Может конечно я неправильно формирую свой вопрос. Просто у меня задача подписать xml. Стандартное api microsoft msdn (раздел System.Security.Cryptography.Xml) позволяет это делать, но только по алгоритму RSA и DSA. Мне же надо подписать по алгоритму, который содержит ключ, т.е. ГОСТ Р 34.11/34.10-2001. Вот я и мучаюсь, как это реализовать. Если можете направьте меня в нужную сторону, плз. Я просто не знаю всех возможностей api microsoft msdn, может там есть способы реализации подписи xml по ГОСТ. Хотя бы порядок моих действий. В каком направлении надо двигаться, а то примеров в интернете много, но все они требуют подключение дополнительных платных библиотек, а мне надо всё это реализовать стандартными методами из api microsoft msdn.

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

Offline Максим Коллегин  
#6 Оставлено : 9 января 2018 г. 11:41:55(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,433
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 737 раз в 634 постах
Чтобы использовать ГОСТ для подписи xml в .NET нужно использовать КриптоПро .NET.
Или написать свой)
Знания в базе знаний, поддержка в центре поддержки
Offline mtv06  
#7 Оставлено : 9 января 2018 г. 11:50:08(UTC)
mtv06

Статус: Активный участник

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

Не подскажите какие методы надо использовать для написания своего?

Просто я видел подобный совет на форуме:

Цитата:
можно еще более заморочиться и использовать апи
- CryptAcquireContext(ref pProv, Cnf.ContName, "", 75, 0)
- CryptGetUserKey(pProv, WinCryptH.AT_KEYEXCHANGE, ref pUserKey)
- CryptGetKeyParam(pUserKey, WinCryptH.KP_CERTIFICATE, pCert, ref dt_len, 0)

и далее new X509Certificate(pCert, dt_len)


таким способом реально? Просто я пробую, что-то не получается(

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

Offline Boris@Serezhkin.com  
#8 Оставлено : 9 января 2018 г. 12:21:11(UTC)
Boris@Serezhkin.com

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Нет, конечно на коленке, да исче на нижнем уровне можно горы свернуть
Только на до ли?
Сертификат у тебя должен быть. Берем Крипто НЕТ СДК и посматриваем на
пример SignSmed вроде Там всего страничка текста.
Offline mtv06  
#9 Оставлено : 9 января 2018 г. 12:50:48(UTC)
mtv06

Статус: Активный участник

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

я пробовал таким способом
Цитата:
signedXml.SigningKey = Certificate.PrivateKey;

в том то и дело, что выскакивает ошибка
Цитата:
Алгоритм ключа сертификата не поддерживается

Offline Максим Коллегин  
#10 Оставлено : 9 января 2018 г. 13:37:50(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,433
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 737 раз в 634 постах
Чтобы не было ошибки и нужно установить КриптоПро .NET
Знания в базе знаний, поддержка в центре поддержки
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.