Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
Спасибо, уже решил проблему, правда "через назад", идея о полном совпадении структуры issuer оказалась верной. Для будущих поколений, возможно кому-нибудь пригодится Код Delphi: Добавление к предыдущим коментариям - TCharArray=array [0.255] of Char; Цитата:function TfrmCrypto.CertIDToContext(iCertID:string):PCCERT_CONTEXT; var vSearchMask:CERT_ID; vSearchSerialNumber:string; vSearchIssuer:string; pSerialNumber:PByte; vInd:integer; vIssuerName:PWideChar; pBufContext:PCCERT_CONTEXT; vBufStrIssuer:TCharArray; begin //Сертификаты ищутся по "маске", для того чтобы найти сертификат, сначала заполняем структуру CERT_ID if not Assigned(hCertMyStore) then if not CertOpenMyStore then begin //Хранилище сертификатов не открыто Exit; end; //Разбираем идентификатор iCertID:=Copy(iCertID, 14, Length(iCertID)); vInd:=pos(' ', iCertID); vSearchIssuer:=Copy(iCertID, vInd+7, Length(iCertID)); vSearchSerialNumber:=AnsiLowerCase(Copy(iCertID, 1, vInd-1)); //Инициализируем структуру сертификата FillChar(vSearchMask, SizeOf(CERT_ID_ISSUER_SERIAL_NUMBER), #0); //Обрабатываем серийный номер сертификата vInd:=Length(vSearchSerialNumber) div 2; //Так как представление HEX то байтов в 2 раза меньше vSearchMask.dwIdChoice:=CERT_ID_ISSUER_SERIAL_NUMBER;//Поиск по IssuerSerialNumber vSearchMask.IssuerSerialNumber.SerialNumber.cbData:=vInd; vSearchMask.IssuerSerialNumber.SerialNumber.pbData:=GetMemory(vInd); pSerialNumber:=vSearchMask.IssuerSerialNumber.SerialNumber.pbData; while (vInd > 0) do begin pSerialNumber^:=StrToInt('0x'+Copy(vSearchSerialNumber, vInd*2-1, 2)); inc(pSerialNumber); dec(vInd); end; //Обрабатывыем имя издателя. Придется извращаться, так как чтобы найти по Issuer необходимо передать полную структуру. GetMem(vIssuerName, Length(vSearchIssuer)*2+1); StringToWideChar(vSearchIssuer, vIssuerName, Length(vSearchIssuer)*2+1); pBufContext:=CertFindCertificateInStore(hCertMyStore, X509_ASN_ENCODING, 0, CERT_FIND_ISSUER_STR, vIssuerName, nil); CertNameToStr(pBufContext.dwCertEncodingType, @pBufContext.pCertInfo.Issuer, CERT_X500_NAME_STR, vBufStrIssuer, 255); vSearchIssuer:=vBufStrIssuer; //Получаем размер структуры издателя CertStrToName(X509_ASN_ENCODING, PAnsiChar(vSearchIssuer), CERT_X500_NAME_STR, nil, nil, vSearchMask.IssuerSerialNumber.Issuer.cbData, nil); vSearchMask.IssuerSerialNumber.Issuer.pbData := GetMemory(vSearchMask.IssuerSerialNumber.Issuer.cbData); //А теперь вносим данные о нем CertStrToName(X509_ASN_ENCODING, PAnsiChar(vSearchIssuer), CERT_X500_NAME_STR, nil, vSearchMask.IssuerSerialNumber.Issuer.pbData, vSearchMask.IssuerSerialNumber.Issuer.cbData, nil); // Ищем сертификат Result:=CertFindCertificateInStore(hCertMyStore, X509_ASN_ENCODING, 0, CERT_FIND_CERT_ID, @vSearchMask, nil); if not Assigned(Result) then begin //Поиск провалился, чего быть не должно, эксепшн Exit; end; end;
Отредактировано пользователем 1 октября 2009 г. 22:35:27(UTC)
| Причина: Не указана
|