|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Запрос на сертификат
Помогите определить что за ошибка выходит при вызове...
Код:
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" В чём может быть проблема? Всё намного проще, чем есть на самом деле... |