Atom Лента - Форум КриптоПро - Тема:получение сертификата с eToken - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:polucheniesertifikataseToken-10:1Copyright 2024 Форум КриптоПро2024-03-19T04:19:26Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruVaskohttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=997&name=VaskoVaskohttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=997&name=VaskoМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим КоллегинVaskohttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=997&name=VaskoМаксим Коллегинhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=3&name=Максим КоллегинVaskohttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=997&name=VaskoYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid4408:1получение сертификата с eToken<table class="content postContainer_Alt" width="100%"><tr><td>спасибо большое!!! вроде всё работает.. .</td></tr></table>2008-12-12T19:08:04+03:002008-12-12T19:08:04+03:00Vasko<table class="content postContainer_Alt" width="100%"><tr><td>спасибо большое!!! вроде всё работает.. .</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid4407:1получение сертификата с eToken<table class="content postContainer" width="100%"><tr><td><a rel="nofollow" href="http://forum.sources.ru/index.php?showtopic=121575" title="http://forum.sources.ru/index.php?showtopic=121575">http://forum.sources.ru/index.php?showtopic=121575</a></td></tr></table>2008-12-12T19:01:10+03:002008-12-12T19:01:10+03:00Максим Коллегин<table class="content postContainer" width="100%"><tr><td><a rel="nofollow" href="http://forum.sources.ru/index.php?showtopic=121575" title="http://forum.sources.ru/index.php?showtopic=121575">http://forum.sources.ru/index.php?showtopic=121575</a></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid4406:1получение сертификата с eToken<table class="content postContainer_Alt" width="100%"><tr><td>спс за ссылочку. делаю следующим образом: <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">WCHAR SIGNER_NAME1[256];
MultiByteToWideChar(CP_ACP, 0, SIGNER_NAME, strlen(SIGNER_NAME)+1, SIGNER_NAME1,strlen(SIGNER_NAME)+1);
_tprintf(TEXT("tratata\n"), SIGNER_NAME1);
</code></pre>
</div></div><br />но не уверен что правильно задаю последние 2 параметра. . .</td></tr></table>2008-12-12T18:50:21+03:002008-12-12T18:50:21+03:00Vasko<table class="content postContainer_Alt" width="100%"><tr><td>спс за ссылочку. делаю следующим образом: <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">WCHAR SIGNER_NAME1[256];
MultiByteToWideChar(CP_ACP, 0, SIGNER_NAME, strlen(SIGNER_NAME)+1, SIGNER_NAME1,strlen(SIGNER_NAME)+1);
_tprintf(TEXT("tratata\n"), SIGNER_NAME1);
</code></pre>
</div></div><br />но не уверен что правильно задаю последние 2 параметра. . .</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid4404:1получение сертификата с eToken<table class="content postContainer" width="100%"><tr><td><a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms776413(VS.85).aspx" title="http://msdn.microsoft.com/en-us/library/ms776413(VS.85).aspx">MultiByteToWideChar</a></td></tr></table>2008-12-12T18:10:12+03:002008-12-12T18:10:12+03:00Максим Коллегин<table class="content postContainer" width="100%"><tr><td><a rel="nofollow" href="http://msdn.microsoft.com/en-us/library/ms776413(VS.85).aspx" title="http://msdn.microsoft.com/en-us/library/ms776413(VS.85).aspx">MultiByteToWideChar</a></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid4403:1получение сертификата с eToken<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день. работаю над созданием и верификацией цифровой подписи с использованием eToken. <br />Возникла проблема следующего рода: если при создании ЭЦП объявлять SIGNER_NAME как #define SIGNER_NAME L"Петров Петр Петрович" всё ок.<br />Но мне нужно "Петров Петр Петрович" получать программно с eToken. Делаю это следующим образом:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">LPBYTE pbUserCert;
HCRYPTKEY hKey = 0;
HCRYPTPROV phProv;
DWORD size;
DWORD fParam = CRYPT_FIRST;
PCCERT_CONTEXT pUserCert=0;
DWORD dwUserCertLength=0;
DWORD name_size;
char *SIGNER_NAME;
CString CERT_STORE;
CryptAcquireContext( &phProv,
NULL,
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",75,
CRYPT_VERIFYCONTEXT
);
while( CryptGetProvParam(phProv, PP_ENUMCONTAINERS, NULL, &size, fParam) )
{
BYTE * ContNameD=(BYTE*)malloc(sizeof(BYTE*)*size);
int len = (int)size;
CryptGetProvParam(phProv, PP_ENUMCONTAINERS, ContNameD, &size, fParam);
ContNameD[len]=0;
CERT_STORE = (CString) ContNameD;
printf(CERT_STORE);
fParam = 0;
}
if(!CryptAcquireContext(&phProv,CERT_STORE,
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",75,CRYPT_MACHINE_KEYSET))
MyHandleError("CryptAcquireContext");
if(!CryptGetUserKey(phProv,AT_KEYEXCHANGE,&hKey))
MyHandleError("CryptGetUserKey");
/*if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, NULL,&dwUserCertLength, 0))
{
MyHandleError ("Error during GetKeyParam.\n");
}
pbUserCert = (BYTE*)malloc (dwUserCertLength);
if (pbUserCert == NULL)
{
MyHandleError ("Error during malloc.\n");
}
if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, pbUserCert,&dwUserCertLength, 0))
{
MyHandleError ("Error during GetKeyParam.\n");
}
/*pUserCert = CertCreateCertificateContext (
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbUserCert,
dwUserCertLength);
if (pUserCert == NULL)
{
MyHandleError ("Error during CertCreateCertificateContext.\n");
}
name_size = CertNameToStr(MY_ENCODING_TYPE,
&(pUserCert->pCertInfo->Subject),
CERT_SIMPLE_NAME_STR,
NULL,
0);
if(!(SIGNER_NAME = (char *)malloc(name_size * sizeof(TCHAR))))
{
MyHandleError(TEXT("Memory allocation failed."));
}
name_size = CertNameToStr(MY_ENCODING_TYPE,
&(pUserCert->pCertInfo->Subject),
CERT_SIMPLE_NAME_STR,
SIGNER_NAME,
name_size);
_tprintf(TEXT("Subject -> %s.\n"), SIGNER_NAME);
CryptReleaseContext(phProv,0);
for(int l=0;l<=3;l++) *SIGNER_NAME=*SIGNER_NAME++;
printf("\n");
//CharToOem(SIGNER_NAME,SIGNER_NAME);
//OemToAnsi(SIGNER_NAME,SIGNER_NAME);
//long SIGNER_NAME=SIGNER_NAME;
_tprintf(SIGNER_NAME);</code></pre>
</div></div><br /><br /><br />и тогда возникает ошибка при вызове(т.е. говорит что не может найти сертификат) <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">CertFindCertificateInStore(
hCertStore,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME,
NULL))</code></pre>
</div></div><br /><br />Я так понимаю что проблема в том, что в программе получаю SIGNER_NAME типа char * , а надо как L"". но как преобразовать не могу понять. .. подскажите плз, если кто знает. <br />Заранее благодарен. </td></tr></table>2008-12-12T17:56:34+03:002008-12-12T17:56:34+03:00Vasko<table class="content postContainer_Alt" width="100%"><tr><td>Добрый день. работаю над созданием и верификацией цифровой подписи с использованием eToken. <br />Возникла проблема следующего рода: если при создании ЭЦП объявлять SIGNER_NAME как #define SIGNER_NAME L"Петров Петр Петрович" всё ок.<br />Но мне нужно "Петров Петр Петрович" получать программно с eToken. Делаю это следующим образом:<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">LPBYTE pbUserCert;
HCRYPTKEY hKey = 0;
HCRYPTPROV phProv;
DWORD size;
DWORD fParam = CRYPT_FIRST;
PCCERT_CONTEXT pUserCert=0;
DWORD dwUserCertLength=0;
DWORD name_size;
char *SIGNER_NAME;
CString CERT_STORE;
CryptAcquireContext( &phProv,
NULL,
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",75,
CRYPT_VERIFYCONTEXT
);
while( CryptGetProvParam(phProv, PP_ENUMCONTAINERS, NULL, &size, fParam) )
{
BYTE * ContNameD=(BYTE*)malloc(sizeof(BYTE*)*size);
int len = (int)size;
CryptGetProvParam(phProv, PP_ENUMCONTAINERS, ContNameD, &size, fParam);
ContNameD[len]=0;
CERT_STORE = (CString) ContNameD;
printf(CERT_STORE);
fParam = 0;
}
if(!CryptAcquireContext(&phProv,CERT_STORE,
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",75,CRYPT_MACHINE_KEYSET))
MyHandleError("CryptAcquireContext");
if(!CryptGetUserKey(phProv,AT_KEYEXCHANGE,&hKey))
MyHandleError("CryptGetUserKey");
/*if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, NULL,&dwUserCertLength, 0))
{
MyHandleError ("Error during GetKeyParam.\n");
}
pbUserCert = (BYTE*)malloc (dwUserCertLength);
if (pbUserCert == NULL)
{
MyHandleError ("Error during malloc.\n");
}
if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, pbUserCert,&dwUserCertLength, 0))
{
MyHandleError ("Error during GetKeyParam.\n");
}
/*pUserCert = CertCreateCertificateContext (
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbUserCert,
dwUserCertLength);
if (pUserCert == NULL)
{
MyHandleError ("Error during CertCreateCertificateContext.\n");
}
name_size = CertNameToStr(MY_ENCODING_TYPE,
&(pUserCert->pCertInfo->Subject),
CERT_SIMPLE_NAME_STR,
NULL,
0);
if(!(SIGNER_NAME = (char *)malloc(name_size * sizeof(TCHAR))))
{
MyHandleError(TEXT("Memory allocation failed."));
}
name_size = CertNameToStr(MY_ENCODING_TYPE,
&(pUserCert->pCertInfo->Subject),
CERT_SIMPLE_NAME_STR,
SIGNER_NAME,
name_size);
_tprintf(TEXT("Subject -> %s.\n"), SIGNER_NAME);
CryptReleaseContext(phProv,0);
for(int l=0;l<=3;l++) *SIGNER_NAME=*SIGNER_NAME++;
printf("\n");
//CharToOem(SIGNER_NAME,SIGNER_NAME);
//OemToAnsi(SIGNER_NAME,SIGNER_NAME);
//long SIGNER_NAME=SIGNER_NAME;
_tprintf(SIGNER_NAME);</code></pre>
</div></div><br /><br /><br />и тогда возникает ошибка при вызове(т.е. говорит что не может найти сертификат) <br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">CertFindCertificateInStore(
hCertStore,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME,
NULL))</code></pre>
</div></div><br /><br />Я так понимаю что проблема в том, что в программе получаю SIGNER_NAME типа char * , а надо как L"". но как преобразовать не могу понять. .. подскажите плз, если кто знает. <br />Заранее благодарен. </td></tr></table>