Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.11.2021, 08:39
Аватар для Aqel
Aqel Aqel вне форума
Прохожий
 
Регистрация: 08.10.2011
Адрес: Пермь
Сообщения: 13
Версия Delphi: XE8 SP1
Репутация: 10
Вопрос Запрос на сертификат

Помогите определить что за ошибка выходит при вызове...

Код:
procedure TForm1.Button3Click(Sender: TObject);
var
  nameAttr: CERT_RDN_ATTR;
  nameString: PChar;
  rdn: CERT_RDN;
  nameInfo: CERT_NAME_INFO;
  certReqInfo: CERT_REQUEST_INFO;
  subjNameBlob: CERT_NAME_BLOB;
  encNameLen: DWORD;
  encName: PBYTE;
  prov: HCRYPTPROV;
  pubKeyInfoLen: DWORD;
  pubKeyInfo: PCERT_PUBLIC_KEY_INFO;
  encCertReqLen: DWORD;
  params: CRYPT_OBJID_BLOB;
  sigAlg: CRYPT_ALGORITHM_IDENTIFIER;
  signedEncCertReq: PBYTE;
  cont: PChar;
  err: string;
  encType: DWORD;
  f: file;
begin
  nameString := StrAlloc(length(LabeledEdit1.Text) + 1);
  StrPCopy(nameString, LabeledEdit1.Text);
  nameAttr.pszObjId := '2.5.4.3';
  nameAttr.dwValueType := CERT_RDN_UTF8_STRING; // CERT_RDN_PRINTABLE_STRING
  nameAttr.Value.cbData := length(LabeledEdit1.Text);
  nameAttr.Value.pbData := PBYTE(nameString);
  rdn.cRDNAttr := 1;
  rdn.rgRDNAttr := @nameAttr;
  nameInfo.cRDN := 1;
  nameInfo.rgRDN := @rdn;
  if not CryptEncodeObject(encType, X509_NAME, @nameInfo, nil, encNameLen) or (encNameLen < 1) then
  begin
    MessageDlg('CryptEncodeObject ошибка ' + inttostr(GetLastError), mtError, [mbOk], 0);
    StrDispose(nameString);
    exit;
  end;
  GetMem(encName, encNameLen);
  if not CryptEncodeObject(PKCS_7_ASN_ENCODING or X509_ASN_ENCODING, X509_NAME, @nameInfo, encName, encNameLen) or (encNameLen < 1) then
  begin
    MessageDlg('2nd CryptEncodeObject ошибка ' + inttostr(GetLastError), mtError, [mbOk], 0);
    StrDispose(nameString);
    FreeMem(encName, encNameLen);
    exit;
  end;
  subjNameBlob.cbData := encNameLen;
  subjNameBlob.pbData := encName;
  certReqInfo.Subject := subjNameBlob;
  certReqInfo.cAttribute := 0;
  certReqInfo.rgAttribute := nil;
  certReqInfo.dwVersion := CERT_REQUEST_V1;
  if length(LabeledEdit10.Text) = 0 then
    cont := nil
  else
  begin
    err := LabeledEdit10.Text;
    cont := StrAlloc(length(err) + 1);
    StrPCopy(cont, err);
  end;
  if not CryptAcquireContext(prov, cont, nil, PROV_RSA_FULL, 0) then
  begin
    case int64(GetLastError) of
      ERROR_INVALID_PARAMETER:
        err := 'ERROR_INVALID_PARAMETER';
      ERROR_NOT_ENOUGH_MEMORY:
        err := 'ERROR_NOT_ENOUGH_MEMORY';
      NTE_BAD_FLAGS:
        err := 'NTE_BAD_FLAGS';
      NTE_BAD_KEYSET:
        err := 'NTE_BAD_KEYSET';
      NTE_BAD_KEYSET_PARAM:
        err := 'NTE_BAD_KEYSET_PARAM';
      NTE_BAD_PROV_TYPE:
        err := 'NTE_BAD_PROV_TYPE';
      NTE_BAD_SIGNATURE:
        err := 'NTE_BAD_SIGNATURE';
      NTE_EXISTS:
        err := 'NTE_EXISTS';
      NTE_KEYSET_ENTRY_BAD:
        err := 'NTE_KEYSET_ENTRY_BAD';
      NTE_KEYSET_NOT_DEF:
        err := 'NTE_KEYSET_NOT_DEF';
      NTE_NO_MEMORY:
        err := 'NTE_NO_MEMORY';
      NTE_PROV_DLL_NOT_FOUND:
        err := 'NTE_PROV_DLL_NOT_FOUND';
      NTE_PROV_TYPE_ENTRY_BAD:
        err := 'NTE_PROV_TYPE_ENTRY_BAD';
      NTE_PROV_TYPE_NO_MATCH:
        err := 'NTE_PROV_TYPE_NO_MATCH';
      NTE_PROV_TYPE_NOT_DEF:
        err := 'NTE_PROV_TYPE_NOT_DEF';
      NTE_PROVIDER_DLL_FAIL:
        err := 'NTE_PROVIDER_DLL_FAIL';
      NTE_SIGNATURE_FILE_BAD:
        err := 'NTE_SIGNATURE_FILE_BAD';
    else
      err := 'Неизвестная ошибка';
    end;
    MessageDlg('Ошибка создания контейнера: ' + err, mtError, [mbOk], 0);
    StrDispose(nameString);
    FreeMem(encName, encNameLen);
    if cont <> nil then
      StrDispose(cont);
    exit;
...

При нажатии на кнопку пишет: "CryptEncodeObject ошибка 2"
В чём может быть проблема?
__________________
Всё намного проще, чем есть на самом деле...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter