| ||||
| ||||
Добрый день. Не получается найти сертификат по его серийному номеру. Поиск выполняю следующим образом. -------------- Начало кода --------------- // Открываем хранилище 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 в вышеуказанном коде. | ||||
Ответы: | ||||
| ||||
Опечатка у меня была в имени CA, выдавшего сертификат. Проблема решена | ||||