27.11.2021, 08:39
|
|
Прохожий
|
|
Регистрация: 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"
В чём может быть проблема?
__________________
Всё намного проще, чем есть на самом деле...
|