Atom Лента - Форум КриптоПро - Тема:CryptoAPI серийный номер сертификата - 10Форум КриптоПро - Atom Лентаurn:https:--www-cryptopro-ru:AtomLenta:ForumKriptoPro:Tema:CryptoAPIserijjnyjjnomersertifikata-10:1Copyright 2024 Форум КриптоПро2024-03-19T15:43:59Zhttps://www.cryptopro.ru/forum2/Images/YAFLogo.pngForum Adminhttps://www.cryptopro.ruforum@cryptopro.ruDmitriy3008https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=1763&name=Dmitriy3008Dmitriy3008https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=1763&name=Dmitriy3008Heliorhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=8857&name=HeliorDmitriy3008https://www.cryptopro.ru/forum2/default.aspx?g=profile&u=1763&name=Dmitriy3008Heliorhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=8857&name=HeliorКирилл Соболевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35&name=Кирилл СоболевHeliorhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=8857&name=HeliorSyrkov Sergeyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=6693&name=Syrkov SergeySyrkov Sergeyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=6693&name=Syrkov SergeyКирилл Соболевhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=35&name=Кирилл СоболевSyrkov Sergeyhttps://www.cryptopro.ru/forum2/default.aspx?g=profile&u=6693&name=Syrkov SergeyYetAnotherForum.NETurn:https:--www-cryptopro-ru:ftPosts:st1:meid15977:1CryptoAPI серийный номер сертификата<table class="content postContainer_Alt" width="100%"><tr><td>Да, по расширениям. Рад помочь коллеге.</td></tr></table>2010-12-29T03:46:11+03:002010-12-29T03:46:11+03:00Dmitriy3008<table class="content postContainer_Alt" width="100%"><tr><td>Да, по расширениям. Рад помочь коллеге.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid15921:1CryptoAPI серийный номер сертификата<table class="content postContainer" width="100%"><tr><td>Спасибо, товарищ )))))<br />Ты меня прям спас, а то я спать не мог.<br />Сижу теперь курю код.<br />Да, из казначейства. По расширениям понял?</td></tr></table>2010-12-25T02:28:39+03:002010-12-25T02:28:39+03:00Helior<table class="content postContainer" width="100%"><tr><td>Спасибо, товарищ )))))<br />Ты меня прям спас, а то я спать не мог.<br />Сижу теперь курю код.<br />Да, из казначейства. По расширениям понял?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid15919:1CryptoAPI серийный номер сертификата<table class="content postContainer_Alt" width="100%"><tr><td>Helior, два примерно одинаковых способа:<br /><br />1)<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
procedure CertGetEnhKeyUsage(Context: PCCERT_CONTEXT; Strings: TStrings);
var
pEnhKeyUsage: PCERT_ENHKEY_USAGE;
cbStructInfo: DWORD;
I: Cardinal;
begin
if not Assigned(Strings) then
raise Exception.Create('ругаемся, что объект не создан...');
if CertGetEnhancedKeyUsage(Context, 0, nil, @cbStructInfo) then
begin
GetMem(pEnhKeyUsage, cbStructInfo);
try
if CertGetEnhancedKeyUsage(Context, 0, pEnhKeyUsage, @cbStructInfo) then
begin
for I := 0 to pEnhKeyUsage^.cUsageIdentifier -1 do
Strings.Add(PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[I]);
end;
finally
FreeMem(pEnhKeyUsage, cbStructInfo);
end;
end;
end;</code></pre>
</div></div><br /><br />2)<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
procedure CertGetEnhKeyUsage(Context: PCCERT_CONTEXT; Strings: TStrings);
var
pExtension: PCERT_EXTENSION;
pEnhKeyUsage: PCERT_ENHKEY_USAGE;
pvStructInfo: PVOID;
cbStructInfo: DWORD;
I: Cardinal;
begin
if not Assigned(Strings) then
raise Exception.Create('ругаемся, что объект не создан...');
pExtension := CertFindExtension(szOID_ENHANCED_KEY_USAGE,
Context^.pCertInfo^.cExtension, Context^.pCertInfo^.rgExtension);
if Assigned(pExtension) and Win32Check(CryptDecodeObject(X509_ASN_ENCODING,
X509_ENHANCED_KEY_USAGE, pExtension^.Value.pbData, pExtension^.Value.cbData, CRYPT_DECODE_NOCOPY_FLAG, nil, @cbStructInfo)) then
begin
GetMem(pvStructInfo, cbStructInfo);
try
CryptDecodeObject(X509_ASN_ENCODING, X509_ENHANCED_KEY_USAGE,
pExtension^.Value.pbData, pExtension^.Value.cbData, 0, pvStructInfo, @cbStructInfo);
pEnhKeyUsage := PCERT_ENHKEY_USAGE(pvStructInfo);
for I := 0 to pEnhKeyUsage^.cUsageIdentifier -1 do
Strings.Add(PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[I]);
finally
FreeMem(pvStructInfo, cbStructInfo);
end;
end;
end;</code></pre>
</div></div><br />Ты не из казначейства?</td></tr></table>2010-12-24T23:22:54+03:002010-12-24T23:22:54+03:00Dmitriy3008<table class="content postContainer_Alt" width="100%"><tr><td>Helior, два примерно одинаковых способа:<br /><br />1)<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
procedure CertGetEnhKeyUsage(Context: PCCERT_CONTEXT; Strings: TStrings);
var
pEnhKeyUsage: PCERT_ENHKEY_USAGE;
cbStructInfo: DWORD;
I: Cardinal;
begin
if not Assigned(Strings) then
raise Exception.Create('ругаемся, что объект не создан...');
if CertGetEnhancedKeyUsage(Context, 0, nil, @cbStructInfo) then
begin
GetMem(pEnhKeyUsage, cbStructInfo);
try
if CertGetEnhancedKeyUsage(Context, 0, pEnhKeyUsage, @cbStructInfo) then
begin
for I := 0 to pEnhKeyUsage^.cUsageIdentifier -1 do
Strings.Add(PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[I]);
end;
finally
FreeMem(pEnhKeyUsage, cbStructInfo);
end;
end;
end;</code></pre>
</div></div><br /><br />2)<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">type
PCharArr = ^TCharArr;
TCharArr = array[0..0] of PChar;
procedure CertGetEnhKeyUsage(Context: PCCERT_CONTEXT; Strings: TStrings);
var
pExtension: PCERT_EXTENSION;
pEnhKeyUsage: PCERT_ENHKEY_USAGE;
pvStructInfo: PVOID;
cbStructInfo: DWORD;
I: Cardinal;
begin
if not Assigned(Strings) then
raise Exception.Create('ругаемся, что объект не создан...');
pExtension := CertFindExtension(szOID_ENHANCED_KEY_USAGE,
Context^.pCertInfo^.cExtension, Context^.pCertInfo^.rgExtension);
if Assigned(pExtension) and Win32Check(CryptDecodeObject(X509_ASN_ENCODING,
X509_ENHANCED_KEY_USAGE, pExtension^.Value.pbData, pExtension^.Value.cbData, CRYPT_DECODE_NOCOPY_FLAG, nil, @cbStructInfo)) then
begin
GetMem(pvStructInfo, cbStructInfo);
try
CryptDecodeObject(X509_ASN_ENCODING, X509_ENHANCED_KEY_USAGE,
pExtension^.Value.pbData, pExtension^.Value.cbData, 0, pvStructInfo, @cbStructInfo);
pEnhKeyUsage := PCERT_ENHKEY_USAGE(pvStructInfo);
for I := 0 to pEnhKeyUsage^.cUsageIdentifier -1 do
Strings.Add(PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[I]);
finally
FreeMem(pvStructInfo, cbStructInfo);
end;
end;
end;</code></pre>
</div></div><br />Ты не из казначейства?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid15918:1CryptoAPI серийный номер сертификата<table class="content postContainer" width="100%"><tr><td>Меня интересуют эти расширения<br /><br /><br />[IMG]http://www.imghost.in/?di=512932073348[/IMG]<br /><br /><br />А в cert.pCertInfo.rgExtension.pszObjId совершенно другое.<br />Или это надо CryptDecodeObject`ом вытаскивать, или я совсем не в ту сторону смотрю... <br />Есть ли где-нибудь наглядный пример подобной разборки сертификата?</td></tr></table>2010-12-24T21:23:41+03:002010-12-24T21:23:41+03:00Helior<table class="content postContainer" width="100%"><tr><td>Меня интересуют эти расширения<br /><br /><br />[IMG]http://www.imghost.in/?di=512932073348[/IMG]<br /><br /><br />А в cert.pCertInfo.rgExtension.pszObjId совершенно другое.<br />Или это надо CryptDecodeObject`ом вытаскивать, или я совсем не в ту сторону смотрю... <br />Есть ли где-нибудь наглядный пример подобной разборки сертификата?</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid15917:1CryptoAPI серийный номер сертификата<table class="content postContainer_Alt" width="100%"><tr><td>Если это вопрос про использование CryptoAPI, то расширения хранятся в массиве CERT_CONTEXT::pCertInfo->rgExtension[]</td></tr></table>2010-12-24T19:30:21+03:002010-12-24T19:30:21+03:00Кирилл Соболев<table class="content postContainer_Alt" width="100%"><tr><td>Если это вопрос про использование CryptoAPI, то расширения хранятся в массиве CERT_CONTEXT::pCertInfo->rgExtension[]</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid15915:1CryptoAPI серийный номер сертификата<table class="content postContainer" width="100%"><tr><td>А не подскажете, как получить из сертификата список расширений в виде strings? </td></tr></table>2010-12-24T18:58:54+03:002010-12-24T18:58:54+03:00Helior<table class="content postContainer" width="100%"><tr><td>А не подскажете, как получить из сертификата список расширений в виде strings? </td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid14465:1CryptoAPI серийный номер сертификата<table class="content postContainer_Alt" width="100%"><tr><td>Кстати, вот так получилось вытащить серийник, топорно, тупо, но работает<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
st,st1,str:String;
...
str:='0123456789ABCDEF';
st1:='';
for i:=pUsercert.pCertInfo.SerialNumber.cbData-1 downto 0 do
Begin
st:=str[trunc(pUserCert.pCertInfo.SerialNumber.pbData[i]/16)+1]+ str[(pUserCert.pCertInfo.SerialNumber.pbData[i]-trunc(pUserCert.pCertInfo.SerialNumber.pbData[i]/16)*16)+1];
st1:=st1+' '+st;
End;
memo1.Lines.Add('Serial Number: '+st1);
</code></pre>
</div></div></td></tr></table>2010-09-13T21:23:20+04:002010-09-13T21:23:20+04:00Syrkov Sergey<table class="content postContainer_Alt" width="100%"><tr><td>Кстати, вот так получилось вытащить серийник, топорно, тупо, но работает<br /><br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
st,st1,str:String;
...
str:='0123456789ABCDEF';
st1:='';
for i:=pUsercert.pCertInfo.SerialNumber.cbData-1 downto 0 do
Begin
st:=str[trunc(pUserCert.pCertInfo.SerialNumber.pbData[i]/16)+1]+ str[(pUserCert.pCertInfo.SerialNumber.pbData[i]-trunc(pUserCert.pCertInfo.SerialNumber.pbData[i]/16)*16)+1];
st1:=st1+' '+st;
End;
memo1.Lines.Add('Serial Number: '+st1);
</code></pre>
</div></div></td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid14461:1CryptoAPI серийный номер сертификата<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Kirill Sobolev написал:</span><blockquote><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>А на выходе пустота.</div></div><br />CertNameToStr предназначен для декодирования имен, а не серийных номеров.</div></div><br />Ну это я уже понял )) Мне бы что-нибудь, хотябы отдаленное, покопаться.</td></tr></table>2010-09-13T20:15:43+04:002010-09-13T20:15:43+04:00Syrkov Sergey<table class="content postContainer" width="100%"><tr><td><div class="quote"><span class="quotetitle">Kirill Sobolev написал:</span><blockquote><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>А на выходе пустота.</div></div><br />CertNameToStr предназначен для декодирования имен, а не серийных номеров.</div></div><br />Ну это я уже понял )) Мне бы что-нибудь, хотябы отдаленное, покопаться.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid14459:1CryptoAPI серийный номер сертификата<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>А на выходе пустота.</div></div><br />CertNameToStr предназначен для декодирования имен, а не серийных номеров.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>И еще такой вопросик. А можно как-нибудь вытаскивать значения указывая параметр в процедуру?</div></div><br />Можно через CertFindRDNAttr, CertRDNValueToStr.</td></tr></table>2010-09-13T19:51:06+04:002010-09-13T19:51:06+04:00Кирилл Соболев<table class="content postContainer_Alt" width="100%"><tr><td><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>А на выходе пустота.</div></div><br />CertNameToStr предназначен для декодирования имен, а не серийных номеров.<br /><div class="quote"><span class="quotetitle">Цитата:</span><blockquote>И еще такой вопросик. А можно как-нибудь вытаскивать значения указывая параметр в процедуру?</div></div><br />Можно через CertFindRDNAttr, CertRDNValueToStr.</td></tr></table>urn:https:--www-cryptopro-ru:ftPosts:st1:meid14452:1CryptoAPI серийный номер сертификата<table class="content postContainer" width="100%"><tr><td>Во-о-о-о. Пасиб!.. Массив с данными получил, но серийник что-то цепляться не хочет... Наверное я тип не тот указываю<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
VAR
SIGNER1_NAME : Array[1.1000] of Char;
name_size: DWORD;
...
name_size:=0;
name_size := CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,@(pUserCert.pCertInfo.SerialNumber),CERT_SIMPLE_NAME_STR,nil ,0);
name_size :=CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,@(pUserCert.pCertInfo.SerialNumber), CERT_SIMPLE_NAME_STR, @SIGNER1_NAME, name_size);
memo1.Lines.Add(((SIGNER1_NAME)));
</code></pre>
</div></div><br />А на выходе пустота.<br />И еще такой вопросик. А можно как-нибудь вытаскивать значения указывая параметр в процедуру? Что-то типа<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
name_size := CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,@(pUserCert.pCertInfo.Subject),CERT_X500_NAME_STR('CN'),nil ,0);
</code></pre>
</div></div></td></tr></table>2010-09-13T19:32:57+04:002010-09-13T19:32:57+04:00Syrkov Sergey<table class="content postContainer" width="100%"><tr><td>Во-о-о-о. Пасиб!.. Массив с данными получил, но серийник что-то цепляться не хочет... Наверное я тип не тот указываю<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
VAR
SIGNER1_NAME : Array[1.1000] of Char;
name_size: DWORD;
...
name_size:=0;
name_size := CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,@(pUserCert.pCertInfo.SerialNumber),CERT_SIMPLE_NAME_STR,nil ,0);
name_size :=CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,@(pUserCert.pCertInfo.SerialNumber), CERT_SIMPLE_NAME_STR, @SIGNER1_NAME, name_size);
memo1.Lines.Add(((SIGNER1_NAME)));
</code></pre>
</div></div><br />А на выходе пустота.<br />И еще такой вопросик. А можно как-нибудь вытаскивать значения указывая параметр в процедуру? Что-то типа<br /><div class="code"><strong>Код:</strong><div class="innercode"><pre class="line-numbers"><code class="language-markup">
name_size := CertNameToStr(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,@(pUserCert.pCertInfo.Subject),CERT_X500_NAME_STR('CN'),nil ,0);
</code></pre>
</div></div></td></tr></table>