Atom Лента - Форум КриптоПро - Тема:Не выводит список сертификатов - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:Nevyvoditspisoksertifikatov-10:1Copyright 2024 Форум КриптоПро2024-03-29T03:44:29Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев АндрейРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев АндрейСергей Акуловhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=60687&name=Сергей АкуловРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев АндрейСергей Акуловhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=60687&name=Сергей АкуловРусев Андрейhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=428&name=Русев АндрейСергей Акуловhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=60687&name=Сергей АкуловYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid128558:1Не выводит список сертификатов<table class="content postContainer_Alt" width="100%"><tr><td>С русскими буквами придётся потрудиться:<br /><a rel="nofollow" href="https://cpdn.cryptopro.ru/content/csp_trunk/html/encodings.html" title="https://cpdn.cryptopro.ru/content/csp_trunk/html/encodings.html">https://cpdn.cryptopro.r...runk/html/encodings.html</a><br />"по возможности пользоваться только widechar-вариантами функций", а затем, например, для печати надо использовать WideCharToMultiByte(CP_UTF8).<br />Сразу уж поясню: wide-строки предваряются буквой L. Например, Ваши "с W тоже подойдёт" должен был выглядеть так: CertOpenSystemStoreW(0, L"MY")).<br />Заморачиваться TCHAR-ом не имеет смысла, кроме редких случаев (все из которых подразумевают кроссплатформенный код для windows и unix).<br />Чтобы упростить работу с перекодировкой строк, рекомендую пользоваться нашим макросом console_w2c из reader/support.h<br />Дарю хорошую кроссплатформенную Си-библиотечку для конверсии (w - от wide, c - от char):<br /><br /><strong>convert.h</strong><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-c">#include "reader/support.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
wchar_t* alloc_c2w(LPCSTR pszSource, UINT encoding);
char* alloc_w2c(LPCWSTR pwszSource, UINT encoding);
char* convert_from_to(LPCSTR pszSource, UINT inEncoding, UINT outEncoding);
#ifdef __cplusplus
}
#endif // __cplusplus
#ifdef UNICODE
# define alloc_t2w(ptszSource, encoding) (ptszSource ? support_wcsdup(ptszSource) : NULL)
# define alloc_w2t(pwszSource, encoding) (pwszSource ? support_wcsdup(pwszSource) : NULL)
#else /* UNICODE */
# define alloc_t2w(ptszSource, encoding) alloc_c2w(ptszSource, encoding)
# define alloc_w2t(pwszSource, encoding) alloc_w2c(pwszSource, encoding)
#endif /* UNICODE */
#define console_alloc_c2w(pszSource) alloc_c2w(pszSource, CPRO_CONSOLE_CP)
#define console_alloc_w2c(pwszSource) alloc_w2c(pwszSource, CPRO_CONSOLE_CP)
#define console_alloc_t2w(ptszSource) alloc_t2w(ptszSource, CPRO_CONSOLE_CP)
#define console_alloc_w2t(pwszSource) alloc_w2t(pwszSource, CPRO_CONSOLE_CP)
</code></pre>
</div></div><br /><br /><strong>convert.c</strong><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-c">#include "convert.h"
#ifdef UNIX
#include "CSP_WinError.h"
#endif // UNIX
// Выставляет LastError при ошибке. Подача NULL на вход -- не ошибка.
wchar_t* alloc_c2w(LPCSTR pszSource, UINT encoding)
{
if (!pszSource) {
return NULL;
}
int wcharsNum = MultiByteToWideChar(encoding, 0, pszSource, -1, NULL, 0);
if (!wcharsNum) {
return NULL;
}
wchar_t* pwszOut = (wchar_t *)malloc(wcharsNum * sizeof(wchar_t));
if (!pwszOut) {
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return NULL;
}
if (!MultiByteToWideChar(encoding, 0, pszSource, -1, pwszOut, wcharsNum)) {
free(pwszOut);
return NULL;
}
return pwszOut;
}
// Выставляет LastError при ошибке. Подача NULL на вход -- не ошибка.
char* alloc_w2c(LPCWSTR pwszSource, UINT encoding)
{
if (!pwszSource) {
return NULL;
}
int charsNum = WideCharToMultiByte(encoding, 0, pwszSource, -1, 0, 0, 0, 0);
if (!charsNum) {
return NULL;
}
char* pszOut = (char *)malloc(charsNum);
if (!pszOut) {
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return NULL;
}
if (!WideCharToMultiByte(encoding, 0, pwszSource, -1, pszOut, charsNum, 0, 0)) {
free(pszOut);
return NULL;
}
return pszOut;
}
// Выставляет LastError при ошибке. Подача NULL на вход -- не ошибка.
char* convert_from_to(LPCSTR pszSource, UINT inEncoding, UINT outEncoding)
{
wchar_t* pwszSource = alloc_c2w(pszSource, inEncoding);
if (!pwszSource) {
return NULL;
}
char* pszOut = alloc_w2c(pwszSource, outEncoding);
free(pwszSource);
return pszOut;
}
</code></pre>
</div></div></td></tr></table>2021-11-03T22:15:35+03:002021-11-03T22:15:35+03:00Русев Андрей<table class="content postContainer_Alt" width="100%"><tr><td>С русскими буквами придётся потрудиться:<br /><a rel="nofollow" href="https://cpdn.cryptopro.ru/content/csp_trunk/html/encodings.html" title="https://cpdn.cryptopro.ru/content/csp_trunk/html/encodings.html">https://cpdn.cryptopro.r...runk/html/encodings.html</a><br />"по возможности пользоваться только widechar-вариантами функций", а затем, например, для печати надо использовать WideCharToMultiByte(CP_UTF8).<br />Сразу уж поясню: wide-строки предваряются буквой L. Например, Ваши "с W тоже подойдёт" должен был выглядеть так: CertOpenSystemStoreW(0, L"MY")).<br />Заморачиваться TCHAR-ом не имеет смысла, кроме редких случаев (все из которых подразумевают кроссплатформенный код для windows и unix).<br />Чтобы упростить работу с перекодировкой строк, рекомендую пользоваться нашим макросом console_w2c из reader/support.h<br />Дарю хорошую кроссплатформенную Си-библиотечку для конверсии (w - от wide, c - от char):<br /><br /><strong>convert.h</strong><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-c">#include "reader/support.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
wchar_t* alloc_c2w(LPCSTR pszSource, UINT encoding);
char* alloc_w2c(LPCWSTR pwszSource, UINT encoding);
char* convert_from_to(LPCSTR pszSource, UINT inEncoding, UINT outEncoding);
#ifdef __cplusplus
}
#endif // __cplusplus
#ifdef UNICODE
# define alloc_t2w(ptszSource, encoding) (ptszSource ? support_wcsdup(ptszSource) : NULL)
# define alloc_w2t(pwszSource, encoding) (pwszSource ? support_wcsdup(pwszSource) : NULL)
#else /* UNICODE */
# define alloc_t2w(ptszSource, encoding) alloc_c2w(ptszSource, encoding)
# define alloc_w2t(pwszSource, encoding) alloc_w2c(pwszSource, encoding)
#endif /* UNICODE */
#define console_alloc_c2w(pszSource) alloc_c2w(pszSource, CPRO_CONSOLE_CP)
#define console_alloc_w2c(pwszSource) alloc_w2c(pwszSource, CPRO_CONSOLE_CP)
#define console_alloc_t2w(ptszSource) alloc_t2w(ptszSource, CPRO_CONSOLE_CP)
#define console_alloc_w2t(pwszSource) alloc_w2t(pwszSource, CPRO_CONSOLE_CP)
</code></pre>
</div></div><br /><br /><strong>convert.c</strong><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-c">#include "convert.h"
#ifdef UNIX
#include "CSP_WinError.h"
#endif // UNIX
// Выставляет LastError при ошибке. Подача NULL на вход -- не ошибка.
wchar_t* alloc_c2w(LPCSTR pszSource, UINT encoding)
{
if (!pszSource) {
return NULL;
}
int wcharsNum = MultiByteToWideChar(encoding, 0, pszSource, -1, NULL, 0);
if (!wcharsNum) {
return NULL;
}
wchar_t* pwszOut = (wchar_t *)malloc(wcharsNum * sizeof(wchar_t));
if (!pwszOut) {
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return NULL;
}
if (!MultiByteToWideChar(encoding, 0, pszSource, -1, pwszOut, wcharsNum)) {
free(pwszOut);
return NULL;
}
return pwszOut;
}
// Выставляет LastError при ошибке. Подача NULL на вход -- не ошибка.
char* alloc_w2c(LPCWSTR pwszSource, UINT encoding)
{
if (!pwszSource) {
return NULL;
}
int charsNum = WideCharToMultiByte(encoding, 0, pwszSource, -1, 0, 0, 0, 0);
if (!charsNum) {
return NULL;
}
char* pszOut = (char *)malloc(charsNum);
if (!pszOut) {
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return NULL;
}
if (!WideCharToMultiByte(encoding, 0, pwszSource, -1, pszOut, charsNum, 0, 0)) {
free(pszOut);
return NULL;
}
return pszOut;
}
// Выставляет LastError при ошибке. Подача NULL на вход -- не ошибка.
char* convert_from_to(LPCSTR pszSource, UINT inEncoding, UINT outEncoding)
{
wchar_t* pwszSource = alloc_c2w(pszSource, inEncoding);
if (!pwszSource) {
return NULL;
}
char* pszOut = alloc_w2c(pwszSource, outEncoding);
free(pwszSource);
return pszOut;
}
</code></pre>
</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128557:1Не выводит список сертификатов<table class="content postContainer" width="100%"><tr><td>Подумал, что с W тоже подойдет. <br />Понимаю, что тут не курсы )<br />Я уже 3 года пишу на java, а тут очень срочная задача с КриптоПро, и так получилось, что некому и некогда, а я решил, что смогу оживить универские знания по плюсам, но, видимо, погорячился. Даже банальное выделение памяти забыл как писать через malloc )<br />Привык, что за тебя все делает Garbage Collector ) Что уж тут.<br /><br />В любом случае, спасибо<br /><br />Переписал код так (пока что):<br />и он что то да вывел. правда с вопросительными знаками вместо наименования сертификата, но с этим уж как-нибудь справлюсь, надеюсь..<br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br />#include "CSP_WinDef.h"<br />#include "CSP_WinCrypt.h"<br />#include "WinCryptEx.h"<br /><br />int main(void)<br />{<br /> HCERTSTORE hSystemStore = NULL;<br /> PCCERT_CONTEXT pCertContext = NULL;<br /> TCHAR *pszNameString = (TCHAR*) malloc(128 * sizeof(TCHAR));<br /><br /> if ((hSystemStore = CertOpenSystemStoreA(0, "MY")))<br /> {<br /> printf("My certificate store has opened.\n");<br /><br /> while ((pCertContext = CertEnumCertificatesInStore(<br /> hSystemStore,<br /> pCertContext)))<br /> {<br /> printf("hi");<br /><br /> if (CertGetNameStringA(<br /> pCertContext,<br /> CERT_NAME_FRIENDLY_DISPLAY_TYPE,<br /> 0,<br /> NULL,<br /> pszNameString,<br /> 128))<br /> {<br /> printf("\nCertificate %s \n", pszNameString);<br /> }<br /> }<br /> }<br /> else<br /> {<br /> printf("My certificate store did not open.");<br /> free(pszNameString);<br /> exit(1);<br /> }<br /><br /> if (!CertCloseStore(hSystemStore, 0))<br /> {<br /> printf("Unable to close My certificate store.\n");<br /> free(pszNameString);<br /> exit(1);<br /> }<br /> else<br /> {<br /> printf("My certificate store closed.\n");<br /> }<br /> free(pszNameString);<br /><br />}<br /><br />Вот вывод:<br />My certificate store has opened.<br />hi<br />Certificate ��� "����" <br />My certificate store closed.<br /><br />Спасибо еще раз.<br /></td></tr></table>2021-11-03T20:28:54+03:002021-11-03T20:28:54+03:00Сергей Акулов<table class="content postContainer" width="100%"><tr><td>Подумал, что с W тоже подойдет. <br />Понимаю, что тут не курсы )<br />Я уже 3 года пишу на java, а тут очень срочная задача с КриптоПро, и так получилось, что некому и некогда, а я решил, что смогу оживить универские знания по плюсам, но, видимо, погорячился. Даже банальное выделение памяти забыл как писать через malloc )<br />Привык, что за тебя все делает Garbage Collector ) Что уж тут.<br /><br />В любом случае, спасибо<br /><br />Переписал код так (пока что):<br />и он что то да вывел. правда с вопросительными знаками вместо наименования сертификата, но с этим уж как-нибудь справлюсь, надеюсь..<br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br />#include "CSP_WinDef.h"<br />#include "CSP_WinCrypt.h"<br />#include "WinCryptEx.h"<br /><br />int main(void)<br />{<br /> HCERTSTORE hSystemStore = NULL;<br /> PCCERT_CONTEXT pCertContext = NULL;<br /> TCHAR *pszNameString = (TCHAR*) malloc(128 * sizeof(TCHAR));<br /><br /> if ((hSystemStore = CertOpenSystemStoreA(0, "MY")))<br /> {<br /> printf("My certificate store has opened.\n");<br /><br /> while ((pCertContext = CertEnumCertificatesInStore(<br /> hSystemStore,<br /> pCertContext)))<br /> {<br /> printf("hi");<br /><br /> if (CertGetNameStringA(<br /> pCertContext,<br /> CERT_NAME_FRIENDLY_DISPLAY_TYPE,<br /> 0,<br /> NULL,<br /> pszNameString,<br /> 128))<br /> {<br /> printf("\nCertificate %s \n", pszNameString);<br /> }<br /> }<br /> }<br /> else<br /> {<br /> printf("My certificate store did not open.");<br /> free(pszNameString);<br /> exit(1);<br /> }<br /><br /> if (!CertCloseStore(hSystemStore, 0))<br /> {<br /> printf("Unable to close My certificate store.\n");<br /> free(pszNameString);<br /> exit(1);<br /> }<br /> else<br /> {<br /> printf("My certificate store closed.\n");<br /> }<br /> free(pszNameString);<br /><br />}<br /><br />Вот вывод:<br />My certificate store has opened.<br />hi<br />Certificate ��� "����" <br />My certificate store closed.<br /><br />Спасибо еще раз.<br /></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128556:1Не выводит список сертификатов<table class="content postContainer_Alt" width="100%"><tr><td>Настоятельно рекомендую всегда собирать с флагами -Wall -Werror.<br />Вы с ошибкой переписали мой вариант CertOpenSystemStoreA(0, "My")) в виде CertOpenSystemStoreW(0, "My")).<br />Под pszNameString не выделена память. Вместо wcstombs, можно просто сделать printf("\nCertificate %S \n", pszNameString);<br />Но у нас тут не курсы программирования.</td></tr></table>2021-11-03T19:21:32+03:002021-11-03T19:21:32+03:00Русев Андрей<table class="content postContainer_Alt" width="100%"><tr><td>Настоятельно рекомендую всегда собирать с флагами -Wall -Werror.<br />Вы с ошибкой переписали мой вариант CertOpenSystemStoreA(0, "My")) в виде CertOpenSystemStoreW(0, "My")).<br />Под pszNameString не выделена память. Вместо wcstombs, можно просто сделать printf("\nCertificate %S \n", pszNameString);<br />Но у нас тут не курсы программирования.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128554:1Не выводит список сертификатов<table class="content postContainer" width="100%"><tr><td>Пакет lsb-cprocsp-devel поставил в самом начале<br />Согласно вашему сообщению пытаюсь кодом ниже вывести личные сертификаты, не перечисляя хранилище:<br /><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br />#include "CSP_WinDef.h"<br />#include "CSP_WinCrypt.h"<br />#include "WinCryptEx.h"<br /><br />int main(void)<br />{<br /> HCERTSTORE hSystemStore = NULL;<br /> PCCERT_CONTEXT pCertContext = NULL;<br /> LPWSTR pszNameString = NULL;<br /><br /> if ((hSystemStore = CertOpenSystemStoreW(0, "MY")))<br /> {<br /> printf("My certificate store has opened.");<br /><br /> while ((pCertContext = CertEnumCertificatesInStore(<br /> hSystemStore,<br /> pCertContext)))<br /> {<br /> if (CertGetNameStringW(<br /> pCertContext,<br /> CERT_NAME_FRIENDLY_DISPLAY_TYPE,<br /> 0,<br /> NULL,<br /> pszNameString,<br /> 256))<br /> {<br /> char buffer[500];<br /> wcstombs(buffer, pszNameString, 500);<br /> printf("\nCertificate %s \n", buffer);<br /> }<br /> }<br /> }<br /> else<br /> {<br /> printf("My certificate store did not open.");<br /> exit(1);<br /> }<br /><br /> if (!CertCloseStore(hSystemStore, 0))<br /> {<br /> printf("Unable to close My certificate store.\n");<br /> exit(1);<br /> }<br /> else<br /> {<br /> printf("My certificate store closed.\n");<br /> }<br />}<br /><br />Получаю вот такой вывод:<br /><br />My certificate store has opened.<br />My certificate store closed.<br /><br />Код не заходит даже в тело while при перечислении сертификатов, не просто в if, на получении имени<br /><br />А вот что говорит менеджер сертификатов:<br />certmgr -list -store My<br /><br />Certmgr 1.1 (c) "Crypto-Pro", 2007-2021.<br />Program for managing certificates, CRLs and stores.<br />WARNING: Legacy parameter: "-store My"<br />=============================================================================<br />1-------<br />Issuer : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2<br />Subject : ОГРН=0000000000000, ИНН=000000000000, СНИЛС=00000000000, C=RU, T=Тест, OU=Тест, O=Тест, E=test@test.com, SN=Тест, G=Тест Тест, CN="ООО ""Тест"""<br />Serial : 0x12005A227A275D66CBDEA062BF0001005A227A<br />SHA1 Thumbprint : 628e2adc42c1c3e339a2ffce56a49d69b47b4ae8<br />SubjKeyID : f8832024a66ae88d8a86df025512248dc34ca182<br />Signature Algorithm : ГОСТ Р 34.11/34.10-2001<br />PublicKey Algorithm : ГОСТ Р 34.10-2012 256 бит (512 bits)<br />Not valid before : 27/10/2021 10:31:22 UTC<br />Not valid after : 27/01/2022 10:41:22 UTC<br />PrivateKey Link : Yes <br />Container : HDIMAGE\\rnd-9-F7.000\2795<br />Provider Name : Crypto-Pro GOST R 34.10-2012 KC1 CSP<br />Provider Info : Provider Type: 80, Key Spec: 2, Flags: 0x0<br />CA cert URL : <a rel="nofollow" href="http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202(1).crt" title="http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202(1).crt">http://testca.cryptopro....Test%20Center%202(1).crt</a><br />OCSP URL : <a rel="nofollow" href="http://testca.cryptopro.ru/ocsp/ocsp.srf" title="http://testca.cryptopro.ru/ocsp/ocsp.srf">http://testca.cryptopro.ru/ocsp/ocsp.srf</a><br />CDP : <a rel="nofollow" href="http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202(1).crl" title="http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202(1).crl">http://testca.cryptopro....Test%20Center%202(1).crl</a><br />Extended Key Usage : 1.3.6.1.5.5.7.3.2 Проверка подлинности клиента<br /> 1.3.6.1.5.5.7.3.4 Защищенная электронная почта<br />=============================================================================</td></tr></table>2021-11-03T18:40:11+03:002021-11-03T18:40:11+03:00Сергей Акулов<table class="content postContainer" width="100%"><tr><td>Пакет lsb-cprocsp-devel поставил в самом начале<br />Согласно вашему сообщению пытаюсь кодом ниже вывести личные сертификаты, не перечисляя хранилище:<br /><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br />#include "CSP_WinDef.h"<br />#include "CSP_WinCrypt.h"<br />#include "WinCryptEx.h"<br /><br />int main(void)<br />{<br /> HCERTSTORE hSystemStore = NULL;<br /> PCCERT_CONTEXT pCertContext = NULL;<br /> LPWSTR pszNameString = NULL;<br /><br /> if ((hSystemStore = CertOpenSystemStoreW(0, "MY")))<br /> {<br /> printf("My certificate store has opened.");<br /><br /> while ((pCertContext = CertEnumCertificatesInStore(<br /> hSystemStore,<br /> pCertContext)))<br /> {<br /> if (CertGetNameStringW(<br /> pCertContext,<br /> CERT_NAME_FRIENDLY_DISPLAY_TYPE,<br /> 0,<br /> NULL,<br /> pszNameString,<br /> 256))<br /> {<br /> char buffer[500];<br /> wcstombs(buffer, pszNameString, 500);<br /> printf("\nCertificate %s \n", buffer);<br /> }<br /> }<br /> }<br /> else<br /> {<br /> printf("My certificate store did not open.");<br /> exit(1);<br /> }<br /><br /> if (!CertCloseStore(hSystemStore, 0))<br /> {<br /> printf("Unable to close My certificate store.\n");<br /> exit(1);<br /> }<br /> else<br /> {<br /> printf("My certificate store closed.\n");<br /> }<br />}<br /><br />Получаю вот такой вывод:<br /><br />My certificate store has opened.<br />My certificate store closed.<br /><br />Код не заходит даже в тело while при перечислении сертификатов, не просто в if, на получении имени<br /><br />А вот что говорит менеджер сертификатов:<br />certmgr -list -store My<br /><br />Certmgr 1.1 (c) "Crypto-Pro", 2007-2021.<br />Program for managing certificates, CRLs and stores.<br />WARNING: Legacy parameter: "-store My"<br />=============================================================================<br />1-------<br />Issuer : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2<br />Subject : ОГРН=0000000000000, ИНН=000000000000, СНИЛС=00000000000, C=RU, T=Тест, OU=Тест, O=Тест, E=test@test.com, SN=Тест, G=Тест Тест, CN="ООО ""Тест"""<br />Serial : 0x12005A227A275D66CBDEA062BF0001005A227A<br />SHA1 Thumbprint : 628e2adc42c1c3e339a2ffce56a49d69b47b4ae8<br />SubjKeyID : f8832024a66ae88d8a86df025512248dc34ca182<br />Signature Algorithm : ГОСТ Р 34.11/34.10-2001<br />PublicKey Algorithm : ГОСТ Р 34.10-2012 256 бит (512 bits)<br />Not valid before : 27/10/2021 10:31:22 UTC<br />Not valid after : 27/01/2022 10:41:22 UTC<br />PrivateKey Link : Yes <br />Container : HDIMAGE\\rnd-9-F7.000\2795<br />Provider Name : Crypto-Pro GOST R 34.10-2012 KC1 CSP<br />Provider Info : Provider Type: 80, Key Spec: 2, Flags: 0x0<br />CA cert URL : <a rel="nofollow" href="http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202(1).crt" title="http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202(1).crt">http://testca.cryptopro....Test%20Center%202(1).crt</a><br />OCSP URL : <a rel="nofollow" href="http://testca.cryptopro.ru/ocsp/ocsp.srf" title="http://testca.cryptopro.ru/ocsp/ocsp.srf">http://testca.cryptopro.ru/ocsp/ocsp.srf</a><br />CDP : <a rel="nofollow" href="http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202(1).crl" title="http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202(1).crl">http://testca.cryptopro....Test%20Center%202(1).crl</a><br />Extended Key Usage : 1.3.6.1.5.5.7.3.2 Проверка подлинности клиента<br /> 1.3.6.1.5.5.7.3.4 Защищенная электронная почта<br />=============================================================================</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128527:1Не выводит список сертификатов<table class="content postContainer_Alt" width="100%"><tr><td>Здравствуйте.<br />Для сборки нужна минимальная установка вместе с пакетом lsb-cprocsp-devel:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-bash">./install.sh lsb-cprocsp-devel</code></pre>
</div></div><br />Сразу после этого, не настраивая никаких ссылок, можно собирать, скажем, примеры.<br />См. /opt/cprocsp/src/readme.unix<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-bash">cd /opt/cprocsp/src/samples/CSP
eval `/opt/cprocsp/src/samples/setenv.sh --64`; make -f Makefile.unix</code></pre>
</div></div><br />Перечислять хранилища не нужно, так как у них фиксированные имена - используйте CertOpenSystemStoreA(0, "My")).<br />См. /opt/cprocsp/src/samples/CSP/CryptMsgSign/</td></tr></table>2021-11-02T22:57:11+03:002021-11-02T22:57:11+03:00Русев Андрей<table class="content postContainer_Alt" width="100%"><tr><td>Здравствуйте.<br />Для сборки нужна минимальная установка вместе с пакетом lsb-cprocsp-devel:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-bash">./install.sh lsb-cprocsp-devel</code></pre>
</div></div><br />Сразу после этого, не настраивая никаких ссылок, можно собирать, скажем, примеры.<br />См. /opt/cprocsp/src/readme.unix<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-bash">cd /opt/cprocsp/src/samples/CSP
eval `/opt/cprocsp/src/samples/setenv.sh --64`; make -f Makefile.unix</code></pre>
</div></div><br />Перечислять хранилища не нужно, так как у них фиксированные имена - используйте CertOpenSystemStoreA(0, "My")).<br />См. /opt/cprocsp/src/samples/CSP/CryptMsgSign/</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid128497:1Не выводит список сертификатов<table class="content postContainer" width="100%"><tr><td>Здравствуйте!<br />Понимаю, что для большинства это покажется глупым вопросом, но я уткнулся в тупик, даже не знаю что и где читать.<br /><br />Появилась задача написать so-библиотеку для последующего встраивания в другой продукт.<br />Библиотека должна уметь 2 вещи, для начала:<br />1) Имитировать команду certmgr -list (перечислить список доступных сертификатов)<br />2) Подписывать<br /><br />Для начала я открыл это:<br /><a rel="nofollow" href="http://cpdn.cryptopro.ru/content/csp_trunk/html/Titul.html" title="http://cpdn.cryptopro.ru/content/csp_trunk/html/Titul.html">http://cpdn.cryptopro.ru...sp_trunk/html/Titul.html</a><br />в одной из веток было сказано, что надо использовать libcapilite20, который находится в пакете devel<br /><br />Скачал последнюю доступную версию CSP 5 <a rel="nofollow" href="https://www.cryptopro.ru/sites/default/files/private/csp/50/12266/linux-amd64_deb.tgz" title="https://www.cryptopro.ru/sites/default/files/private/csp/50/12266/linux-amd64_deb.tgz">https://www.cryptopro.ru...2266/linux-amd64_deb.tgz</a><br />Поставил все пакеты )<br />Подключил flash-накопитель и открыл интерфейс cp-tools<br />Подтянулся контейнер, импортировал сертификат в "Личные"<br /><br />Выполнил последовательно 2 команды:<br />1) csptestf -absorb -certs -autoprov<br />2) csptest -keyset -enum_cont -fqcn -verifyc<br />Судя по их выводу сертификат успешно подтянулся, и затем, после выполнения команды certmgr -list я получал детальную информацию об имеющемся сертификату.<br /><br />Далее я начал смотреть примеры из папки samples в opt/cprocsp/src/../..<br />А также просматривать документацию по первой ссылке, а точнее уже другой раздел - <a rel="nofollow" href="http://cpdn.cryptopro.ru/content/capilite_trunk/html/Titul.html" title="http://cpdn.cryptopro.ru/content/capilite_trunk/html/Titul.html">http://cpdn.cryptopro.ru...te_trunk/html/Titul.html</a><br />и документацию Microsoft Docs по CryptoAPI<br /><br />Понял, что для первой задачи необходимо:<br />1) CertEnumSystemStore - и передать туда <br /> а) CERT_SYSTEM_STORE_CURRENT_USER так как я правильно понимаю, что "Личные" доступны для текущего пользователя ? (было бы странно, если нет)<br /> б) NULL - так написано в Microsoft Docs<br /> в) ссылку на функцию, которая будет выводить данные<br />2) вызвать функцию CertOpenSystemStoreA и передать туда 0, потому что первый параметр по документации по сути выпилен и наименование хранилища, полученного первой функцией<br /><br />3) В результате второго пункта мы получаем контекст первого сертификата и в цикле можем пройтись по всем сертификатам хранилища методом CertEnumCertificatesInStore<br /><br />По примерам написал на C небольшой файл - по сути почти пример из Microsoft Docs<br />Собрал его командой: gcc -g -Wall -o p1 p1.c -DUNIX -DHAVE_LIMITS_H -DHAVE_STDIN_H -I/opt/cprocsp/include -I/opt/cprocsp/include/cpcsp -I/opt/cprocsp/include/capilite -DSIZEOF_VOID_P=8 -L/opt/cprocsp/lib/amd64 -lrdrsup -lcapi20 -lpthread -lcapi10<br /><br />Предварительно добавив символьные ссылки на пути к библиотекам в систему<br /><br />Запустил полученный файл и получил список хранилищ, в том числе хранилище "My", которое ведь и есть "Личные" ?<br />Но, по какой-то причине не было выведено ни одного сертификата<br /><br />код вывода сертификатов проще некуда:<br />HCERTSTORE hSystemStore = NULL;<br />PCCERT_CONTEXT pCertContext = NULL;<br /><br />if ((hSystemStore = CertOpenSystemStoreA(0, pwszSystemStore)))<br />{<br />printf("The %S system store opened.\n", pwszSystemStore);<br /><br />while ((pCertContext = CertEnumCertificatesInStore(<br /> hSystemStore,<br /> pCertContext)))<br /> {<br /> if (CertGetNameString(<br /> pCertContext,<br /> CERT_NAME_SIMPLE_DISPLAY_TYPE,<br /> 0,<br /> NULL,<br /> pszNameString,<br /> 128))<br /> {<br /> printf("\nCertificate for %s \n", pszNameString);<br /> }<br /> else<br /> fprintf(stderr, "CertGetName failed. \n");<br /> }<br /> }<br /> else<br /> {<br /> printf("The %S system store did not open.\n", pwszSystemStore);<br /> exit(1);<br /> }<br /><br /> if (!CertCloseStore(hSystemStore, 0))<br /> {<br /> printf("Unable to close the %S system store.\n", pwszSystemStore);<br /> exit(1);<br /> }<br /> else<br /> {<br /> printf("The %S system store closed.\n", pwszSystemStore);<br /> }<br /><br />И теперь вопрос. Что я делаю не так? Что я не сделал ? Куда мне вообще смотреть ))</td></tr></table>2021-11-01T21:23:02+03:002021-11-01T21:23:02+03:00Сергей Акулов<table class="content postContainer" width="100%"><tr><td>Здравствуйте!<br />Понимаю, что для большинства это покажется глупым вопросом, но я уткнулся в тупик, даже не знаю что и где читать.<br /><br />Появилась задача написать so-библиотеку для последующего встраивания в другой продукт.<br />Библиотека должна уметь 2 вещи, для начала:<br />1) Имитировать команду certmgr -list (перечислить список доступных сертификатов)<br />2) Подписывать<br /><br />Для начала я открыл это:<br /><a rel="nofollow" href="http://cpdn.cryptopro.ru/content/csp_trunk/html/Titul.html" title="http://cpdn.cryptopro.ru/content/csp_trunk/html/Titul.html">http://cpdn.cryptopro.ru...sp_trunk/html/Titul.html</a><br />в одной из веток было сказано, что надо использовать libcapilite20, который находится в пакете devel<br /><br />Скачал последнюю доступную версию CSP 5 <a rel="nofollow" href="https://www.cryptopro.ru/sites/default/files/private/csp/50/12266/linux-amd64_deb.tgz" title="https://www.cryptopro.ru/sites/default/files/private/csp/50/12266/linux-amd64_deb.tgz">https://www.cryptopro.ru...2266/linux-amd64_deb.tgz</a><br />Поставил все пакеты )<br />Подключил flash-накопитель и открыл интерфейс cp-tools<br />Подтянулся контейнер, импортировал сертификат в "Личные"<br /><br />Выполнил последовательно 2 команды:<br />1) csptestf -absorb -certs -autoprov<br />2) csptest -keyset -enum_cont -fqcn -verifyc<br />Судя по их выводу сертификат успешно подтянулся, и затем, после выполнения команды certmgr -list я получал детальную информацию об имеющемся сертификату.<br /><br />Далее я начал смотреть примеры из папки samples в opt/cprocsp/src/../..<br />А также просматривать документацию по первой ссылке, а точнее уже другой раздел - <a rel="nofollow" href="http://cpdn.cryptopro.ru/content/capilite_trunk/html/Titul.html" title="http://cpdn.cryptopro.ru/content/capilite_trunk/html/Titul.html">http://cpdn.cryptopro.ru...te_trunk/html/Titul.html</a><br />и документацию Microsoft Docs по CryptoAPI<br /><br />Понял, что для первой задачи необходимо:<br />1) CertEnumSystemStore - и передать туда <br /> а) CERT_SYSTEM_STORE_CURRENT_USER так как я правильно понимаю, что "Личные" доступны для текущего пользователя ? (было бы странно, если нет)<br /> б) NULL - так написано в Microsoft Docs<br /> в) ссылку на функцию, которая будет выводить данные<br />2) вызвать функцию CertOpenSystemStoreA и передать туда 0, потому что первый параметр по документации по сути выпилен и наименование хранилища, полученного первой функцией<br /><br />3) В результате второго пункта мы получаем контекст первого сертификата и в цикле можем пройтись по всем сертификатам хранилища методом CertEnumCertificatesInStore<br /><br />По примерам написал на C небольшой файл - по сути почти пример из Microsoft Docs<br />Собрал его командой: gcc -g -Wall -o p1 p1.c -DUNIX -DHAVE_LIMITS_H -DHAVE_STDIN_H -I/opt/cprocsp/include -I/opt/cprocsp/include/cpcsp -I/opt/cprocsp/include/capilite -DSIZEOF_VOID_P=8 -L/opt/cprocsp/lib/amd64 -lrdrsup -lcapi20 -lpthread -lcapi10<br /><br />Предварительно добавив символьные ссылки на пути к библиотекам в систему<br /><br />Запустил полученный файл и получил список хранилищ, в том числе хранилище "My", которое ведь и есть "Личные" ?<br />Но, по какой-то причине не было выведено ни одного сертификата<br /><br />код вывода сертификатов проще некуда:<br />HCERTSTORE hSystemStore = NULL;<br />PCCERT_CONTEXT pCertContext = NULL;<br /><br />if ((hSystemStore = CertOpenSystemStoreA(0, pwszSystemStore)))<br />{<br />printf("The %S system store opened.\n", pwszSystemStore);<br /><br />while ((pCertContext = CertEnumCertificatesInStore(<br /> hSystemStore,<br /> pCertContext)))<br /> {<br /> if (CertGetNameString(<br /> pCertContext,<br /> CERT_NAME_SIMPLE_DISPLAY_TYPE,<br /> 0,<br /> NULL,<br /> pszNameString,<br /> 128))<br /> {<br /> printf("\nCertificate for %s \n", pszNameString);<br /> }<br /> else<br /> fprintf(stderr, "CertGetName failed. \n");<br /> }<br /> }<br /> else<br /> {<br /> printf("The %S system store did not open.\n", pwszSystemStore);<br /> exit(1);<br /> }<br /><br /> if (!CertCloseStore(hSystemStore, 0))<br /> {<br /> printf("Unable to close the %S system store.\n", pwszSystemStore);<br /> exit(1);<br /> }<br /> else<br /> {<br /> printf("The %S system store closed.\n", pwszSystemStore);<br /> }<br /><br />И теперь вопрос. Что я делаю не так? Что я не сделал ? Куда мне вообще смотреть ))</td></tr></table>