Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline AlexEr81  
#1 Оставлено : 9 ноября 2012 г. 13:49:08(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.11.2012(UTC)
Сообщений: 65
Откуда: Ростовская область

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
Здравствуйте. Прошу помощи. Нужно прочитать содержимое запроса на сертификат. У меня не получается (вернее я не знаю, как это сделать и не могу нигде найти пример) прочитать дополнительные данные из запроса, такие как назначения сертификата, ИНН, КПП, ОГРН, и прочее всё что там есть. В сертификате эти данные хранятся так:
ИНН, КПП, ОГРН и еще некоторые данные хранятся в Extensions->Subject Alternative Name-> otherName
Читаю их так:
Код:
…………………
pExtension:=CertFindExtension(szOID_SUBJECT_ALT_NAME2, pCertContext^.pCertInfo^.cExtension,
	                                  pCertContext^.pCertInfo^.rgExtension);
………………….

Всё нужное удается получить.
Назначения сертификата хранятся в Extensions->Extended Key Usage
Читаю их так:
Код:
…………………
pExtension := CertFindExtension(szOID_ENHANCED_KEY_USAGE, pCertContext^.pCertInfo^.cExtension, pCertContext^.pCertInfo^.rgExtension);
………………….

Также всё нужное удается получить.

Где все это хранится в запросе? Я думаю что в PCERT_REQUEST_INFO.rgAttribute но не пойму как их достать.
Вот запрос:

Цитата:
MIIGMjCCBd8CAQAwggIDMSswKQYJKoZIhvcNAQkBHhwAaQB2AGEAbgBvAHYAQABtAGEAaQBsAC4A
cgB1MQswCQYDVQQGEwJSVTEtMCsGA1UECB4kBCAEPgRBBEIEPgQyBEEEOgQwBE8AIAQ+BDEEOwQw
BEEEQgRMMRcwFQYDVQQHHg4EGAQyBDAEPQQ+BDIEPjEhMB8GA1UECh4YBB4EEAQeACAAIgQYBDIE
MAQ9BD4EMgAiMR8wHQYDVQQLHhYEQARDBDoEPgQyBD4ENARBBEIEMgQ+MSMwIQYDVQQqHhoEGAQy
BDAEPQAgBBgEMgQwBD0EPgQyBDgERzEVMBMGA1UEBB4MBBgEMgQwBD0EPgQyMRkwFwYDVQQMHhAE
NAQ4BEAENQQ6BEIEPgRAMREwDwYDVQQrHggEGAAuBBgALjEnMCUGA1UECR4eBEMEOwAuACAEGAQy
BDAEPQQ+BDIEMAAsACAANQA2MVEwTwYJKoZIhvcNAQkCHkIAMQAuADIALgA2ADQAMwAuADMALgA2
ADEALgAxAC4AMQAuADYALgA1ADAAMgA3ADEAMAAuADMALgA0AC4AMgAuADExIjAgBggqhQMDgQMB
AR4UADYAMAAwADAAMAAwADAAMAAwADAxMTAvBgNVBAMeKAQYBDIEMAQ9BD4EMgAgBBgEMgQwBD0A
IAQYBDIEMAQ9BD4EMgQ4BEcwYzAcBgYqhQMCAhMwEgYHKoUDAgIkAAYHKoUDAgIeAQNDAARAQNu2
82s4ejX1c8sIoV49i2ZTuN8hkgutNXTVE46Gs1iZBG2kqg/rlVj95+bhuRXMd7BLavBaeT0h/0Sr
QzWCFaCCA2wwOQYKKwYBBAGCNwIBDjErMCkwJwYDVR0gBCAwHjANBgsqhQMDPZ7XNgECAjANBgsq
hQMDPZ7XNgEDATCCAWIGCSqGSIb3DQEJDjGCAVMwggFPMIHgBgNVHREEgdgwgdWgEwYDVQQMoAwT
CjExMDkwOTI0MjmGATCgGAYIKoUDA4EDAQGgDBMKNjAwMDAwMDAwMKAZBgoqhQMDPZ7XNgEHoAsT
CTYwMDAwMDAwMKAbBgoqhQMDPZ7XNgEFoA0TCzAzMDAwMDAwMDAwoBoGByqFAwHgOQGgDxMNODAw
MjAyMDIwMjIyMqAYBgkqhkiG9w0BCRSgCxMJSVZBTk9WX0lJoBkGCiqFAwM9ntc2AQigCxMJODM5
ODY0NzczoBgGBSqFA2QBoA8TDTEwMjYwMDAwMDAwMDAwWgYDVR0CBFMwUQQfyOLg7e7iIMji4O0g
yOLg7e7i6PcgMTEwOTA5MjQyOQMCA/gwKoATMjAxMjExMDkwOTI0MjkuOTQzWoETMjAxMzExMDkw
OTI0MjkuOTQzWjAOBgNVHQ8BAf8EBAMCA/gwggHHBgorBgEEAYI3AgEOMYIBtzCCAbMwggGvBgNV
HSUEggGmMIIBogYPKoUDAz0BAQae1zYDBAEBBggqhQMCAQYIBQYPKoUDAz0BAQae1zYDBAECBg8q
hQMDPQEBBp7XNgMEAQMGDyqFAwM9AQEGntc2AwQBBAYPKoUDAz0BAQae1zYDBAEFBg8qhQMDPQEB
Bp7XNgMEAQYGDyqFAwM9AQEGntc2AwQBBwYPKoUDAz0BAQae1zYDBAEIBg8qhQMDPQEBBp7XNgME
AQkGDyqFAwM9AQEGntc2AwQBCgYPKoUDAz0BAQae1zYDBAELBg8qhQMDPQEBBp7XNgMEAQwGDyqF
AwM9AQEGntc2AwQBDQYPKoUDAz0BAQae1zYDBAEOBgwqhQMDPZ7XNgEGAwMGDCqFAwM9ntc2AQYD
AgYIKoUDAgEGCAUGDCqFAwM9nvIwAQQBAQYMKoUDAz2e8jABBAECBggrBgEFBQcDAgYOKoUDAz2e
1zYBBgMEAQEGDiqFAwM9ntc2AQYDBAECBg4qhQMDPZ7XNgEGAwQBAwYOKoUDAz2e1zYBBgMEAQQG
DSqFAwM9ntc2AQYDBQEGDSqFAwM9ntc2AQYDBQIwCgYGKoUDAgIDBQADQQAwtoWoj3uZjqbymmj/
dEmwmKr073VgiIUlFZX1IuXUx3N44FQ0vh8APl2y4U2vHKR8ZBjt96OEbaAgiJzVkP71

В нём данные которые не могу извлечь
Extended Key Usage:
Цитата:
АСФК(1.2.643.3.61.1.1.6.502710.3.4.1.1),ЭЦП файла документа(1.2.643.2.1.6.8.5),Сертификат предназначен для ППО АС ФК(1.2.643.3.61.1.1.6.502710.3.4.1.1),ЭЦП документа ППО АС ФК(1.2.643.3.61.1.1.6.502710.3.4.1.2),Подпись первичных документов, содержащих бюджетные данные(1.2.643.3.61.1.1.6.502710.3.4.1.3),Подпись первичных документов ЗКР(1.2.643.3.61.1.1.6.502710.3.4.1.4),Подпись первичных документов по обработке поступлений(1.2.643.3.61.1.1.6.502710.3.4.1.5),Подпись электронных платежных документов(1.2.643.3.61.1.1.6.502710.3.4.1.6),Подпись первичных документов по бухгалтерскому учету(1.2.643.3.61.1.1.6.502710.3.4.1.7),Подпись отчетов(1.2.643.3.61.1.1.6.502710.3.4.1.8),Подпись первичных документов по внесению изменений в НСИ(1.2.643.3.61.1.1.6.502710.3.4.1.9),Подпись протоколов и квитанций(1.2.643.3.61.1.1.6.502710.3.4.1.10),Имитозащита данных(1.2.643.3.61.1.1.6.502710.3.4.1.11),Подпись файлов АСФК(1.2.643.3.61.1.1.6.502710.3.4.1.12),Тестирование(1.2.643.3.61.1.1.6.502710.3.4.1.13),Замещение права подписи(1.2.643.3.61.1.1.6.502710.3.4.1.14),Landocs. Делопроизводство(1.2.643.3.61.502710.1.6.3.3),СЭД. Электронный документооборот(1.2.643.3.61.502710.1.6.3.2;1.2.643.2.1.6.8.5),СПТО. Передача статистической информации о технологических операциях(1.2.643.3.61.506160.1.4.1.1;1.2.643.3.61.506160.1.4.1.2),Работа с ООС (Аутентификация клиента)(1.3.6.1.5.5.7.3.2),Заказчик. Администратор организации(1.2.643.3.61.502710.1.6.3.4.1.1),Заказчик. Уполномоченный специалист(1.2.643.3.61.502710.1.6.3.4.1.2),Заказчик. Должностное лицо с правом подписи контракта(1.2.643.3.61.502710.1.6.3.4.1.3),Заказчик. Специалист с правом направления проекта контракта участнику размещения заказа(1.2.643.3.61.502710.1.6.3.4.1.4),Работа с ГМУ(1.3.6.1.5.5.7.3.2),Работа с ГМУ. ЭП администратора организации(1.2.643.3.61.502710.1.6.3.5.1),Работа с ГМУ. ЭП уполномоченного специалиста(1.2.643.3.61.502710.1.6.3.5.2)

Subject Alternative Name-> otherName
Цитата:
ИНН, КПП, ОГРН, Учётный номер организации ГМУ, Учетная запись пользователя АСФК, Код организации в сводном перечне заказчиков, Идентификатор ключей при смене:
6000000000, 600000000, 1026000000000, 839864773, IVANOV_II, 03000000000, 1109092429


Вот код:

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
encType, size, rsize: DWORD;
skip,req_info_len, key_len: DWORD;
buf: PBYTE;
 nameBLOB: PCERT_NAME_BLOB;
s: string;
Flags, sz: dword;
reqB64: PBYTE;
pCertReqInfo: PCERT_SIGNED_CONTENT_INFO;
req_info: PCERT_REQUEST_INFO;
pExtension: PCERT_EXTENSION;
subj: PCERT_NAME_BLOB;
ps: PChar;
 nameString: PChar;
 file_:Tstrings;
 szOID: LPSTR;
   cbStructInfo, dwCommonNameLength, i: Cardinal;
  pvStructInfo: Cardinal;
   pEnhKeyUsage: PCERT_ENHKEY_USAGE;
     pNameInfo: PCERT_ALT_NAME_INFO;
    zz: PCRYPT_ATTRIBUTE;




   type
  PCRYPT_ATTRIBUTE = array of CRYPT_ATTRIBUTE;
begin
OpenDialog1.FilterIndex:=1;

 if OpenDialog1.Execute then
  begin
file_:=Tstringlist.Create;
file_.LoadFromFile(OpenDialog1.FileName);
s:=file_.Text;

RepMemo.Lines.Add('');
 RepMemo.Lines.Add('====================');
 RepMemo.Lines.Add('Информация из файла - '+OpenDialog1.FileName);
 RepMemo.Lines.Add('====================');
RepMemo.Lines.Add('содержимое:');
RepMemo.Lines.Add(s);

 
Flags := CRYPT_STRING_BASE64;


CryptStringToBinary(pchar(s), Length(s), Flags, nil, sz, skip, Flags);
GetMem(reqB64, sz);
CryptStringToBinary(pchar(s), Length(s), Flags, reqB64, sz, skip, Flags);
  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, X509_CERT, reqB64, sz, CRYPT_DECODE_NOCOPY_FLAG, nil, @rsize);

  GetMem(pCertReqInfo,rsize);

  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       X509_CERT, reqB64,
                       sz,
                       CRYPT_DECODE_NOCOPY_FLAG,
                       pCertReqInfo,
                       @rsize);

  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       X509_CERT_REQUEST_TO_BE_SIGNED,
                       pCertReqInfo^.ToBeSigned.pbData,
                       pCertReqInfo^.ToBeSigned.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,
                       nil,
                       @req_info_len);

  GetMem(req_info, req_info_len);

  CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       X509_CERT_REQUEST_TO_BE_SIGNED,
                       pCertReqInfo^.ToBeSigned.pbData,
                       pCertReqInfo^.ToBeSigned.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,
                       req_info,
                       @req_info_len);




  RepMemo.Lines.Add('Распечатка значения открытого ключа:');
RepMemo.Lines.Add(ByteArrayToStr2(req_info.SubjectPublicKeyInfo.PublicKey.pbData, req_info.SubjectPublicKeyInfo.PublicKey.cbData));

     subj:=@req_info^.Subject;
      ps := StrAlloc(512);
     CertNameToStr(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, subj, CERT_X500_NAME_STR,  ps, 512);

RepMemo.Lines.Add('Subject=================================:');
RepMemo.Lines.Add(ps);
RepMemo.Lines.Add('=========================');
RepMemo.Lines.Add('Ф.И.О. - '+extZn(ps,'CN'));
     RepMemo.Lines.Add('Организация - '+extZn(ps,'O'));
     RepMemo.Lines.Add('Отдел - '+extZn(ps,'OU'));
     RepMemo.Lines.Add('Должность владельца сертификата - '+extZn(ps,'T'));
     RepMemo.Lines.Add('Наименование населенного пункта - '+extZn(ps,'L'));
     RepMemo.Lines.Add('Регион - '+extZn(ps,'S'));
     RepMemo.Lines.Add('Формализованная должность в АСФК - '+extZn(ps,'OID.1.2.840.113549.1.9.2')+'('+OIDtoStr(extZn(ps,'OID.1.2.840.113549.1.9.2'))+')');
RepMemo.Lines.Add('=========================');



for I := 0 to req_info.cAttribute-1 do
BEGIN
RepMemo.Lines.Add(PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].pszObjId);
RepMemo.Lines.Add((ByteArrayToStr3(PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.pbData, PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.cbData)));

CryptBinaryToString(PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.pbData,PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.cbData,CRYPT_STRING_HEX,nil,size);
  nameString := StrAlloc(size);
if size > 1 then
CryptBinaryToString(PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.pbData,PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.cbData,CRYPT_STRING_HEX,namestring,size);
if size > 1 then
RepMemo.Lines.Add(nameString);

 END;

file_.free;

end;
end;

function ByteArrayToStr3(pbData: PByte; cbData: DWORD): String;
var
I, J,k: Integer;
S: String;
begin
Result := '';
if not Assigned(pbData) or (cbData <= 0) then
Exit;
k:=cbData div 2;
for I := cbData - 1 downto 0 do
begin
J := PByteArray(pbData)^[i];
S := (CHR(J));
if ((J>=32) and (J<=126)) or (J=168)or (J=184) or (J=185) or ((J>=192) and (J<=255))   then
Result := S + Result

end;
end;


req_info.cAttribute получается равным 3. во втором атрибуте есть нужные данные :
Цитата:
oid- 1.2.840.113549.1.9.14
0O0аUШ0ХU11090924290*6000000000*=Ч6600000000*=Ч603000000000*а98002020202222*HчIVANOV_II*=Ч6839864773*d10260000000000ZUS0QИванов Иван Иванович 1109092429ш0*20121109092429.943Z20131109092429.943Z0Uяш

Только не понято, как привести в нормальный вид.

Наверно в третьем атрибуте OIDы с Extended Key Usage, не знаю как раскодировать их . Прошу помощи!
Offline Kirill Sobolev  
#2 Оставлено : 9 ноября 2012 г. 14:13:54(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Только не понято, как привести в нормальный вид.

Аналогично - CryptDecodeObject(.., szOID_ENHANCED_KEY_USAGE, ..)
Техническую поддержку оказываем тут
Наша база знаний
Offline AlexEr81  
#3 Оставлено : 9 ноября 2012 г. 17:25:01(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.11.2012(UTC)
Сообщений: 65
Откуда: Ростовская область

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
Пробую так:
Код:
if Win32Check(CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       szOID_ENHANCED_KEY_USAGE,
                       req_info.rgAttribute.rgValue.pbData,
                       req_info.rgAttribute.rgValue.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,nil, @cbStructInfo))
 then
begin
   pvStructInfo := LocalAlloc(LMEM_FIXED, cbStructInfo);

CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       szOID_ENHANCED_KEY_USAGE,
                       req_info.rgAttribute.rgValue.pbData,
                       req_info.rgAttribute.rgValue.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,Pointer(pvStructInfo), @cbStructInfo);


      pEnhKeyUsage := PCERT_ENHKEY_USAGE(pvStructInfo);

      for j := 0 to pEnhKeyUsage^.cUsageIdentifier -1 do
      RepMemo.Lines.Add(OIDtoStr(PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[j])+'('+PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[j]+')');
       
     LocalFree(pvStructInfo);
    end;

или так:
Код:
if Win32Check(CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       szOID_ENHANCED_KEY_USAGE,
                       PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.pbData,
                       PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,nil, @cbStructInfo))
 then
begin
   pvStructInfo := LocalAlloc(LMEM_FIXED, cbStructInfo);

CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING,
                       szOID_ENHANCED_KEY_USAGE,
                       PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.pbData,
                       PCRYPT_ATTRIBUTE(req_info.rgAttribute)[i].rgValue.cbData,
                       CRYPT_DECODE_NOCOPY_FLAG,Pointer(pvStructInfo), @cbStructInfo);


      pEnhKeyUsage := PCERT_ENHKEY_USAGE(pvStructInfo);

      for j := 0 to pEnhKeyUsage^.cUsageIdentifier -1 do
      RepMemo.Lines.Add(OIDtoStr(PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[j])+'('+PCharArr(pEnhKeyUsage^.rgpszUsageIdentifier)[j]+')');
     
     LocalFree(pvStructInfo);
    end;


Пишет
Цитата:
Встречено неверно значение тега ASN1
Offline Kirill Sobolev  
#4 Оставлено : 9 ноября 2012 г. 17:47:25(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Нет, в одном атрибуте лежат все расширения.
Его сначала надо декодировать CryptDecodeObject(.., szOID_CERT_EXTENSIONS, ..), а затем уже к этому применять Ваш код.
Структура запроса хорошо видна, если его распарсить в текстовом виде, например при помощи certutil.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#5 Оставлено : 9 ноября 2012 г. 17:52:41(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,190
Мужчина
Российская Федерация

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Kirill Sobolev написал:
Нет, в одном атрибуте лежат все расширения.
Его сначала надо декодировать CryptDecodeObject(.., szOID_CERT_EXTENSIONS, ..), а затем уже к этому применять Ваш код.
Структура запроса хорошо видна, если его распарсить в текстовом виде, например при помощи certutil.


Или ASN.1 Dump-ом ..

Код:
041C 30  1C7: . . . SEQUENCE {
0420 06    A: . . . . OBJECT IDENTIFIER
            : . . . . . certReqExtensions (1 3 6 1 4 1 311 2 1 14)
042C 31  1B7: . . . . SET {
0430 30  1B3: . . . . . SEQUENCE {
0434 30  1AF: . . . . . . SEQUENCE {
0438 06    3: . . . . . . . OBJECT IDENTIFIER extKeyUsage (2 5 29 37)
043D 04  1A6: . . . . . . . OCTET STRING, encapsulates {
0441 30  1A2: . . . . . . . . . SEQUENCE {
0445 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 1'
0456 06    8: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 2 1 6 8 5'
0460 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 2'
0471 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 3'
0482 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 4'
0493 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 5'
04A4 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 6'
04B5 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 7'
04C6 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 8'
04D7 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 9'
04E8 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 10'
04F9 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 11'
050A 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 12'
051B 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 13'
052C 06    F: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 1 1 6 502710 3 4 1 14'
053D 06    C: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 3'
054B 06    C: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 2'
0559 06    8: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 2 1 6 8 5'
0563 06    C: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 506160 1 4 1 1'
0571 06    C: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 506160 1 4 1 2'
057F 06    8: . . . . . . . . . . OBJECT IDENTIFIER
            : . . . . . . . . . . . clientAuth (1 3 6 1 5 5 7 3 2)
0589 06    E: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 4 1 1'
0599 06    E: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 4 1 2'
05A9 06    E: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 4 1 3'
05B9 06    E: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 4 1 4'
05C9 06    D: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 5 1'
05D8 06    D: . . . . . . . . . . OBJECT IDENTIFIER '1 2 643 3 61 502710 1 6 3 5 2'
            : . . . . . . . . . . }
            : . . . . . . . . . }
            : . . . . . . . }
            : . . . . . . }
            : . . . . . }
            : . . . . }
            : . . . }
            : . . }

Отредактировано пользователем 9 ноября 2012 г. 17:54:35(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline AlexEr81  
#6 Оставлено : 14 декабря 2012 г. 14:28:54(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.11.2012(UTC)
Сообщений: 65
Откуда: Ростовская область

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
Спасибо! с вопросом выше всё получилось.
Возникла ещё проблема:
с помощью кода:
Код:
 nameString := StrAlloc(512);
   CertNameToStr(encType, @nameBlob, CERT_X500_NAME_STR, nameString, 512);

извлекаю информацию о субъекте. Не нравится что если в названии организации есть кавычки то после извлечения добавляется ещё куча кавычек - двоится каждая + еще все наименование в кавычки берется
т.е. было ОАО "Газпром" получается - "ОАО ""Газпром"""
в случае извлечения данных с сертификата сделал так:

Код:
var
   nameBLOB: CERT_NAME_BLOB;
 pcert_name:Pcert_name_info;
      rdn_attr:PCERT_RDN_ATTR;
  nameString: PChar;

nameBLOB := pCertContext^.pCertInfo^.Subject;
if Win32Check(CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, X509_NAME,  nameBLOB.pbData,
nameBLOB.cbData, 0, nil, @cbStructInfo)) then
begin
  GetMem(pcert_name, cbStructInfo);
CryptDecodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, X509_NAME,  nameBLOB.pbData,
nameBLOB.cbData, 0, pcert_name, @cbStructInfo);
if assigned(pcert_name) then
 begin
   rdn_attr:=CertFindRDNAttr(szOID_ORGANIZATION_NAME,pcert_name);
   CertRDNValueToStr(rdn_attr.dwValueType,@rdn_attr.Value,nil, size);
   nameString := StrAlloc(size);
   CertRDNValueToStr(rdn_attr.dwValueType,@rdn_attr.Value,nameString, size);
   RepMemo.Lines.Add('Организация - '+nameString);
 end;
end;

в nameString вернулось наименование организации в нормальном виде без лишних кавычек.
а в случае извлечения данных из запроса на сертификат, делаю все также
Код:

.....
только - nameBLOB :=req_info^.Subject;
.....


но получается что size=0 и в namestring ничего не попадает
В чём тут дело?

Отредактировано пользователем 14 декабря 2012 г. 14:30:17(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#7 Оставлено : 14 декабря 2012 г. 15:18:45(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Чтоб не добавлялась куча кавычек есть флаг CERT_NAME_STR_NO_QUOTING_FLAG.
Техническую поддержку оказываем тут
Наша база знаний
Offline AlexEr81  
#8 Оставлено : 14 декабря 2012 г. 19:05:14(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.11.2012(UTC)
Сообщений: 65
Откуда: Ростовская область

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
оказалось
Код:
CertRDNValueToStr(rdn_attr.dwValueType,@rdn_attr.Value,nil, size);


почему то не задает значения size

в случае с сертификатом до этой строки size=9781236. откуда взялось не понял. вроде в коде переменная size не
используется до этой строки.

для запроса задаю вручную size. получается извлечь наименование организации с помощью CertRDNValueToStr
Offline Kirill Sobolev  
#9 Оставлено : 14 декабря 2012 г. 19:55:38(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
почему то не задает значения size

зато она его возвращает, если размер строки недостаточен.
Техническую поддержку оказываем тут
Наша база знаний
Offline AlexEr81  
#10 Оставлено : 17 января 2013 г. 10:57:21(UTC)
AlexEr81

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.11.2012(UTC)
Сообщений: 65
Откуда: Ростовская область

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 1 раз в 1 постах
Подскажите пожалуйста. Мне нужно извлечь из контейнера значение открытого ключа (в запросе это req_info.SubjectPublicKeyInfo.PublicKey а в сертификате pCertContext^.pCertInfo^.SubjectPublicKeyInfo.PublicKey) пытаюсь так:
Код:
var
  Prov: HCRYPTPROV;
  SignKey: HCRYPTKEY;
  BufSize: DWORD;
  d:Pbyte;
  begin 
   CryptAcquireContext(@Prov,’Имя контейнера’ ,CP_GR3410_2001_PROV_A,PROV_GOST_2001_DH,0);
   CryptGetUserKey(Prov,AT_KEYEXCHANGE,@SignKey);
   CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,nil,@BufSize);
   GetMem(D,BufSize);
   CryptExportKey(SignKey,0,PUBLICKEYBLOB,0,d,@BufSize);
   repmemo.Lines.Append(ByteArrayToStr(d,BufSize)); 
   CryptDestroyKey(SignKey);
   CryptReleaseContext(Prov,0);


в D получается значение почти такое как в запросе или сертификате.
должно быть:
Цитата:
0440 9179 D934 EAA5 CB83 6ADD 480F C696 5C5B CFEF 94ED FCF9 E18C C99E CD2C E530 E8A6 34B3 84DA 5389 9439 6BFC EEAA 5009 92F2 37BC F049 60CF F658 680F 68C1 B2E0 813C

получается:
Цитата:
0620 0000 232E 0000 4D41 4731 0002 0000 3012 0607 2A85 0302 0224 0006 072A 8503 0202 1E01 9179 D934 EAA5 CB83 6ADD 480F C696 5C5B CFEF 94ED FCF9 E18C C99E CD2C E530 E8A6 34B3 84DA 5389 9439 6BFC EEAA 5009 92F2 37BC F049 60CF F658 680F 68C1 B2E0 813C

что не так делаю?

Отредактировано пользователем 17 января 2013 г. 13:23:14(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.