Статус: Активный участник
Группы: Участники
Зарегистрирован: 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 но не пойму как их достать. Вот запрос: Цитата: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
В нём данные которые не могу извлечь 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, не знаю как раскодировать их . Прошу помощи!
|