Atom Лента - Форум КриптоПро - Тема:(CryptoAPI) как найти сертификат - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:(CryptoAPI)kaknajjtisertifikat-10:1Copyright 2024 Форум КриптоПро2024-03-28T22:33:40Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruAndreyMhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=231&name=AndreyMAndreyMhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=231&name=AndreyMЮрийhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=123&name=ЮрийКирилл Соболевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35&name=Кирилл СоболевДмитрий Жигулинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=249&name=Дмитрий ЖигулинКирилл Соболевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35&name=Кирилл СоболевAndreyMhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=231&name=AndreyMКирилл Соболевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35&name=Кирилл СоболевAndreyMhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=231&name=AndreyMAndreyMhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=231&name=AndreyMМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим КоллегинYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid484:1(CryptoAPI) как найти сертификат<table class="content postContainer_Alt" width="100%"><tr><td>Чтобы зашифровать данные не обязательно ведь, чтобы у сертификата была ссылка на контейнер с закрытым ключем. Или я не прав?<br />И кстати в хранилице MY можно установить сертификат у которого есть только открытый ключ. И отображаться он там будет. И даже наверное зашифровать что-нибудь им получится.<br /><br />Я решил делать по такому алгоритму: <br />Сначала выбираем криптопровайдер, потом перечисляем его алгоритмы CryptGetProvParam(.., PP_ENUMALGS, ..) и, о да, как долго я искал как сделать, с помощью GET_ALG_CLASS(x) проверяем чтобы алгоритм был ALG_CLASS_DATA_ENCRYPT (EncryptAlgorithm.pszObjId ведь параметр указывает на алгоритм шифрования данных сессионным ключем). Потом показываем сертификаты CryptUIDlgSelectCertificate из хранилища MY но потом наверное придется из того, куда ставятся сертификаты от других пользователей, фильтруя из так, чтобы у сертификата pRecipientCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId присутствовал в списке поддерживаемых алгоритмов выбранного ранее криптопровайдера.<br /><br />И уже даже почти получилось это все реализовать :)</td></tr></table>2008-02-27T14:48:23+03:002008-02-27T14:48:23+03:00AndreyM<table class="content postContainer_Alt" width="100%"><tr><td>Чтобы зашифровать данные не обязательно ведь, чтобы у сертификата была ссылка на контейнер с закрытым ключем. Или я не прав?<br />И кстати в хранилице MY можно установить сертификат у которого есть только открытый ключ. И отображаться он там будет. И даже наверное зашифровать что-нибудь им получится.<br /><br />Я решил делать по такому алгоритму: <br />Сначала выбираем криптопровайдер, потом перечисляем его алгоритмы CryptGetProvParam(.., PP_ENUMALGS, ..) и, о да, как долго я искал как сделать, с помощью GET_ALG_CLASS(x) проверяем чтобы алгоритм был ALG_CLASS_DATA_ENCRYPT (EncryptAlgorithm.pszObjId ведь параметр указывает на алгоритм шифрования данных сессионным ключем). Потом показываем сертификаты CryptUIDlgSelectCertificate из хранилища MY но потом наверное придется из того, куда ставятся сертификаты от других пользователей, фильтруя из так, чтобы у сертификата pRecipientCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId присутствовал в списке поддерживаемых алгоритмов выбранного ранее криптопровайдера.<br /><br />И уже даже почти получилось это все реализовать :)</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid480:1(CryptoAPI) как найти сертификат<table class="content postContainer" width="100%"><tr><td>К AndreyM: стоит задача зашифровать данные с использованием сертификатов. <br /><br />Первично необходимо сказать, что сертификат должен быть из хранилища сертификатов "My" (Personal). В теории, конечно, привязку ключевого контейнера можно сделать к сертификату в любом хранилище, но для нормальной работы нормальной программы все-таки рекомендую ограничить пользователя одним хранилищем.<br /><br />После выбора сертификата из данного хранилища уже (заранее!) известно, что данный сертификат содержит привязку к ключевому контейнеру (иначе данный сертификат просто не будет отображаться в хранилище "My" и не будет доступен для выбора). Другой вопрос, что существование данного контейнера ключей и секретного ключа в нем должна быть проверена. Как это сделать уже рассказали.<br /><br />Также после выбора сертификата известен криптопровайдер на котором можно выполнять операции подписи/шифрования (вообще-то не все сертификаты можно использовать одновременно для всех этих действий, но ограничимся простым примером). У данного криптопровайдера перебираем все его алгоритмы (ранее тоже пояснили как именно) и предлагаем их для выбора пользователю.<br /><br />После все этих манипуляций получаем полный набор информации для осуществления необходимой операции.<br /></td></tr></table>2008-02-27T13:57:24+03:002008-02-27T13:57:24+03:00Юрий<table class="content postContainer" width="100%"><tr><td>К AndreyM: стоит задача зашифровать данные с использованием сертификатов. <br /><br />Первично необходимо сказать, что сертификат должен быть из хранилища сертификатов "My" (Personal). В теории, конечно, привязку ключевого контейнера можно сделать к сертификату в любом хранилище, но для нормальной работы нормальной программы все-таки рекомендую ограничить пользователя одним хранилищем.<br /><br />После выбора сертификата из данного хранилища уже (заранее!) известно, что данный сертификат содержит привязку к ключевому контейнеру (иначе данный сертификат просто не будет отображаться в хранилище "My" и не будет доступен для выбора). Другой вопрос, что существование данного контейнера ключей и секретного ключа в нем должна быть проверена. Как это сделать уже рассказали.<br /><br />Также после выбора сертификата известен криптопровайдер на котором можно выполнять операции подписи/шифрования (вообще-то не все сертификаты можно использовать одновременно для всех этих действий, но ограничимся простым примером). У данного криптопровайдера перебираем все его алгоритмы (ранее тоже пояснили как именно) и предлагаем их для выбора пользователю.<br /><br />После все этих манипуляций получаем полный набор информации для осуществления необходимой операции.<br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid475:1(CryptoAPI) как найти сертификат<table class="content postContainer_Alt" width="100%"><tr><td>1. Имя контейнера знать придется все равно. Даже функция CryptFindCertificateKeyProvInfo не подключит контейнер, если вдруг его нет в системе.<br />2. Тем не менее, работает, несмотря на название. И иногда возникают некоторые неприятные эффекты.<br />3. Это безусловно высокоуровневая функция, но она никак не реализует операцию подписи.</td></tr></table>2008-02-26T21:26:20+03:002008-02-26T21:26:20+03:00Кирилл Соболев<table class="content postContainer_Alt" width="100%"><tr><td>1. Имя контейнера знать придется все равно. Даже функция CryptFindCertificateKeyProvInfo не подключит контейнер, если вдруг его нет в системе.<br />2. Тем не менее, работает, несмотря на название. И иногда возникают некоторые неприятные эффекты.<br />3. Это безусловно высокоуровневая функция, но она никак не реализует операцию подписи.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid473:1(CryptoAPI) как найти сертификат<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Да, ошибка вылезет в момент создания подписи, вернее не ошибка а предложение указать нужный контейнер. А вот такой вопрос - CryptAcquireCertificatePrivateKey нормально работает с сертификатам, у которых ссылки на секретный ключ нет (например сертификат прочитан из файла), а смогут ли высокоуровневые фунции подписи сделаь тоже самое?<br /></div></div><br />1. Откуда бедный пользователь узнает имя контейнера :) , ему вообще быть достаточно ключика на сертификате и знания пин кода.<br />2. CryptAcquireCertificatePrivateKey не будет работать с сертификатом без приватного ключа, это должно быть понятно из её названия.<br />3. CryptAcquireCertificatePrivateKey - это и есть высокоуровенвая функция, она напрямую в провайдере не реализуется.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Нет. Контейнер - это объект для хранения ключевой информации. Сертификат - это связь ОК с текстовой строкой. Вообщем то это 2 независимых объекта, вот для того чтоб их связать можно сертификату прописать ссылку на контейнер секретного ключа. Можно связать наоборот - в контейнер записать сертификат.</div></div><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />В идеале конечно. Но иногда провайдеру просто неоткуда взять ОК, кроме как вычислить его из секретного.<br /></div></div><br />мда...</td></tr></table>2008-02-26T20:22:29+03:002008-02-26T20:22:29+03:00Дмитрий Жигулин<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Да, ошибка вылезет в момент создания подписи, вернее не ошибка а предложение указать нужный контейнер. А вот такой вопрос - CryptAcquireCertificatePrivateKey нормально работает с сертификатам, у которых ссылки на секретный ключ нет (например сертификат прочитан из файла), а смогут ли высокоуровневые фунции подписи сделаь тоже самое?<br /></div></div><br />1. Откуда бедный пользователь узнает имя контейнера :) , ему вообще быть достаточно ключика на сертификате и знания пин кода.<br />2. CryptAcquireCertificatePrivateKey не будет работать с сертификатом без приватного ключа, это должно быть понятно из её названия.<br />3. CryptAcquireCertificatePrivateKey - это и есть высокоуровенвая функция, она напрямую в провайдере не реализуется.<br /><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Нет. Контейнер - это объект для хранения ключевой информации. Сертификат - это связь ОК с текстовой строкой. Вообщем то это 2 независимых объекта, вот для того чтоб их связать можно сертификату прописать ссылку на контейнер секретного ключа. Можно связать наоборот - в контейнер записать сертификат.</div></div><br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br />В идеале конечно. Но иногда провайдеру просто неоткуда взять ОК, кроме как вычислить его из секретного.<br /></div></div><br />мда...</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid467:1(CryptoAPI) как найти сертификат<table class="content postContainer_Alt" width="100%"><tr><td>Работает :) Но сделано это было не от хорошей жизни и тем более не является правильным способом задания алгоритма шифрования в общем случае.</td></tr></table>2008-02-26T17:07:40+03:002008-02-26T17:07:40+03:00Кирилл Соболев<table class="content postContainer_Alt" width="100%"><tr><td>Работает :) Но сделано это было не от хорошей жизни и тем более не является правильным способом задания алгоритма шифрования в общем случае.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid465:1(CryptoAPI) как найти сертификат<table class="content postContainer" width="100%"><tr><td>Конкретно для Крипто-про в CRYPT_ALGORITHM_IDENTIFIER.pszObjId похоже можно вообще передавать любую строку, даже просто "" работает :)</td></tr></table>2008-02-26T16:17:38+03:002008-02-26T16:17:38+03:00AndreyM<table class="content postContainer" width="100%"><tr><td>Конкретно для Крипто-про в CRYPT_ALGORITHM_IDENTIFIER.pszObjId похоже можно вообще передавать любую строку, даже просто "" работает :)</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid461:1(CryptoAPI) как найти сертификат<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Контейнер - это привязка секретного ключа к сертификату</div></div><br />Нет. Контейнер - это объект для хранения ключевой информации. Сертификат - это связь ОК с текстовой строкой. Вообщем то это 2 независимых объекта, вот для того чтоб их связать можно сертификату прописать ссылку на контейнер секретного ключа. Можно связать наоборот - в контейнер записать сертификат.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>CertGetCertificateContextProperty в данном случае не вернет ошибки.</div></div><br />Да, ошибка вылезет в момент создания подписи, вернее не ошибка а предложение указать нужный контейнер. А вот такой вопрос - CryptAcquireCertificatePrivateKey нормально работает с сертификатам, у которых ссылки на секретный ключ нет (например сертификат прочитан из файла), а смогут ли высокоуровневые фунции подписи сделаь тоже самое?<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote> в осталных случаях провайдер не должен этого делать. </div></div><br />В идеале конечно. Но иногда провайдеру просто неоткуда взять ОК, кроме как вычислить его из секретного.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>как тогда правильно, имея только сертификат, определить какой OID алгоритма использовать в структуре CRYPT_ALGORITHM_IDENTIFIER </div></div><br />Надо смотреть какие алгоритмы поддерживает CSP - CryptGetProvParam(.., PP_ENUMALGS, ..)</td></tr></table>2008-02-26T15:21:03+03:002008-02-26T15:21:03+03:00Кирилл Соболев<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>Контейнер - это привязка секретного ключа к сертификату</div></div><br />Нет. Контейнер - это объект для хранения ключевой информации. Сертификат - это связь ОК с текстовой строкой. Вообщем то это 2 независимых объекта, вот для того чтоб их связать можно сертификату прописать ссылку на контейнер секретного ключа. Можно связать наоборот - в контейнер записать сертификат.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>CertGetCertificateContextProperty в данном случае не вернет ошибки.</div></div><br />Да, ошибка вылезет в момент создания подписи, вернее не ошибка а предложение указать нужный контейнер. А вот такой вопрос - CryptAcquireCertificatePrivateKey нормально работает с сертификатам, у которых ссылки на секретный ключ нет (например сертификат прочитан из файла), а смогут ли высокоуровневые фунции подписи сделаь тоже самое?<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote> в осталных случаях провайдер не должен этого делать. </div></div><br />В идеале конечно. Но иногда провайдеру просто неоткуда взять ОК, кроме как вычислить его из секретного.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>как тогда правильно, имея только сертификат, определить какой OID алгоритма использовать в структуре CRYPT_ALGORITHM_IDENTIFIER </div></div><br />Надо смотреть какие алгоритмы поддерживает CSP - CryptGetProvParam(.., PP_ENUMALGS, ..)</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid458:1(CryptoAPI) как найти сертификат<table class="content postContainer" width="100%"><tr><td>передаю NULL - работает :) проверил на сертификате с ГОСТом и с RSA. а как тогда правильно, имея только сертификат, определить какой OID алгоритма использовать в структуре CRYPT_ALGORITHM_IDENTIFIER ?</td></tr></table>2008-02-26T01:41:04+03:002008-02-26T01:41:04+03:00AndreyM<table class="content postContainer" width="100%"><tr><td>передаю NULL - работает :) проверил на сертификате с ГОСТом и с RSA. а как тогда правильно, имея только сертификат, определить какой OID алгоритма использовать в структуре CRYPT_ALGORITHM_IDENTIFIER ?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid457:1(CryptoAPI) как найти сертификат<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">maxdm написал:</span><blockquote><br /><strong>CRYPT_ENCRYPT_MESSAGE_PARA Structure</strong><br />....<br /><strong>hCryptProv </strong><br />This member is not used and should be set to NULL.</div></div><br /><br />странно, все описания смотрю в локальном мсдн, который вместе со студией ставится. там этой строчке нет. а сейчас посмотрел в онлайновой версии. действительно так написано. но тогда вопрос как функция CeryptEncryptMessage узнает каким криптопровайдером шифровать сообщение? Из сертификата по-моему она такую информацию не достанет. В любом случае попробую передавать NULL и напишу что получилось.</td></tr></table>2008-02-26T00:38:07+03:002008-02-26T00:38:07+03:00AndreyM<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">maxdm написал:</span><blockquote><br /><strong>CRYPT_ENCRYPT_MESSAGE_PARA Structure</strong><br />....<br /><strong>hCryptProv </strong><br />This member is not used and should be set to NULL.</div></div><br /><br />странно, все описания смотрю в локальном мсдн, который вместе со студией ставится. там этой строчке нет. а сейчас посмотрел в онлайновой версии. действительно так написано. но тогда вопрос как функция CeryptEncryptMessage узнает каким криптопровайдером шифровать сообщение? Из сертификата по-моему она такую информацию не достанет. В любом случае попробую передавать NULL и напишу что получилось.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid456:1(CryptoAPI) как найти сертификат<table class="content postContainer" width="100%"><tr><td>хм<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /><strong>CRYPT_ENCRYPT_MESSAGE_PARA Structure</strong><br />....<br /><strong>hCryptProv </strong><br />This member is not used and should be set to NULL.</div></div></td></tr></table>2008-02-26T00:14:53+03:002008-02-26T00:14:53+03:00Максим Коллегин<table class="content postContainer" width="100%"><tr><td>хм<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote><br /><strong>CRYPT_ENCRYPT_MESSAGE_PARA Structure</strong><br />....<br /><strong>hCryptProv </strong><br />This member is not used and should be set to NULL.</div></div></td></tr></table>