Статус: Активный участник
Группы: Участники
Зарегистрирован: 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(); Кто сможет подсказать? Подскажите, пожалуйста, что я делаю не так?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,433  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 737 раз в 634 постах
|
А примеры в КриптоПро .NET SDK не хотите посмотреть? |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,433  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 737 раз в 634 постах
|
Кажется, что вам не хватает фундаментальных знаний. Сертификат обычно создает и подписывает УЦ. Почитайте про PKI. |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,433  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 737 раз в 634 постах
|
Чтобы использовать ГОСТ для подписи xml в .NET нужно использовать КриптоПро .NET. Или написать свой) |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.08.2010(UTC) Сообщений: 259 Откуда: Moscow
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 11 раз в 10 постах
|
Нет, конечно на коленке, да исче на нижнем уровне можно горы свернуть Только на до ли? Сертификат у тебя должен быть. Берем Крипто НЕТ СДК и посматриваем на пример SignSmed вроде Там всего страничка текста.
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.12.2017(UTC) Сообщений: 43  Откуда: Карелия
|
я пробовал таким способом Цитата:signedXml.SigningKey = Certificate.PrivateKey; в том то и дело, что выскакивает ошибка Цитата:Алгоритм ключа сертификата не поддерживается
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,433  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 737 раз в 634 постах
|
Чтобы не было ошибки и нужно установить КриптоПро .NET |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close