11.12.2007 14:07:34Поиск сертификата по серийному номеру Ответов: 1
Ильшат Абшарипов
Добрый день.
Не получается найти сертификат по его серийному номеру. Поиск выполняю следующим образом.

-------------- Начало кода ---------------

// Открываем хранилище
hStoreHandle := CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, 0, CERT_SYSTEM_STORE_CURRENT_USER, PWideChar(WideString('MY')));
if hStoreHandle = nil then
begin // The MY store could not be opened
FLastErrorCode := GetLastError;
Exit;
end;

// Заполняем информацию о необходимом сертификате
FillChar(CertInfo, SizeOf(CERT_INFO), #0);
CertInfo.dwVersion := CERT_V3;

iLen := Length(CertSerial) div 2;
CertInfo.SerialNumber.cbData := iLen;
CertInfo.SerialNumber.pbData := GetMemory(iLen);

// Переводим строковое представление серийного номера в его двоичную форму
// Серийный номер в виде "610fc22e00060000000c"
P := CertInfo.SerialNumber.pbData
i:= Length(Value) - 1;
while i >= 0 do
begin
P^ := GetHexValue(Value[i]) * 16 + GetHexValue(Value[i + 1]);
P := Pointer(Integer(P) + 1);

dec(i, 2);
end;
// В результате по адресу, куда указывает CertInfo.SerialNumber.pbData, имеем последовательность
// байт $61 $0f $c2 $2e $00 $06 $00 $00 $00 $0c

// Перекодируем имя выдавшего CA
if not CertStrToName(X509_ASN_ENCODING, PAnsiChar('CN=DevDrv CA'), CERT_X500_NAME_STR, nil, nil, CertInfo.Issuer.cbData, nil) then
begin // Cannot get converted issuer name length
FLastErrorCode := GetLastError;
Exit;
end;
CertInfo.Issuer.pbData := GetMemory(CertInfo.Issuer.cbData);
if not CertStrToName(X509_ASN_ENCODING, PAnsiChar('CN=DevDrv CA'), CERT_X500_NAME_STR, nil, CertInfo.Issuer.pbData, CertInfo.Issuer.cbData, nil) then
begin // Cannot convert issuer name
FLastErrorCode := GetLastError;
Exit;
end;

// Ищем сертификат
pSignerCert := CertFindCertificateInStore(hStoreHandle, X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_CERT, @CertInfo, nil);

-------------- Окончание кода ---------------

В результате pSignerCert = nil.

Пробовал получить сертификат по имени того, кому выдавался сертификат. При этом и серийный номер, и перекодированное имя выдавшего CA совпадают с теми, которые я передаю в CertFindCertificateInStore в вышеуказанном коде.
 
Ответы:
11.12.2007 14:37:56Ильшат Абшарипов
Опечатка у меня была в имени CA, выдавшего сертификат. Проблема решена