Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline AndrewMuravev  
#1 Оставлено : 19 июня 2020 г. 9:51:59(UTC)
AndrewMuravev

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.06.2020(UTC)
Сообщений: 8
Российская Федерация

Есть простой код, который должен в тихом режиме импортировать закрытый ключ их pfx контейнера в реестр, но он выдает ошибку GetLastError = 87, почему?
Если открывать pfx без флага PKCS12_IMPORT_SILENT, то все работает, выдается окно для ввода пароля, и после ввода, ключ импортируется.
Версия CSP 4.0.9963

Код:

HANDLE hfile = INVALID_HANDLE_VALUE;
hfile = CreateFileA(xFilePath.c_str(), FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

CRYPT_DATA_BLOB blob;
blob.cbData = GetFileSize(hfile, 0);
BYTE *fb = (BYTE*)malloc(blob.cbData * sizeof(BYTE));
DWORD dw = 0;
BOOL b1 = ReadFile(hfile, fb, blob.cbData, &dw, NULL);
blob.pbData = (BYTE*)fb;
BOOL b2 = PFXIsPFXBlob(&blob);
cout << "b2 = " << b2 << endl;

HCERTSTORE pfxStore = 0;
pfxStore = PFXImportCertStore(&blob, xPassword.c_str(), PKCS12_IMPORT_SILENT);
if (!pfxStore) cout << "Store not open" << endl;

cout << "GetLastError = " << GetLastError() << endl; //87
cout << "pfxStore = " << pfxStore << endl; //00000000
Offline Михаил Селезнёв  
#2 Оставлено : 23 июня 2020 г. 8:38:11(UTC)
Михаил Селезнёв

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 05.04.2017(UTC)
Сообщений: 363
Мужчина
Российская Федерация

Сказал «Спасибо»: 3 раз
Поблагодарили: 54 раз в 53 постах
Добрый день!
На какой ОС производите описанное?
Offline AndrewMuravev  
#3 Оставлено : 23 июня 2020 г. 11:03:10(UTC)
AndrewMuravev

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.06.2020(UTC)
Сообщений: 8
Российская Федерация

Автор: Михаил Селезнёв Перейти к цитате
Добрый день!
На какой ОС производите описанное?


OC Win7 SP1 x64
Offline Михаил Селезнёв  
#4 Оставлено : 25 июня 2020 г. 15:41:31(UTC)
Михаил Селезнёв

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 05.04.2017(UTC)
Сообщений: 363
Мужчина
Российская Федерация

Сказал «Спасибо»: 3 раз
Поблагодарили: 54 раз в 53 постах
Поправили в новой сборке.
Offline AndrewMuravev  
#5 Оставлено : 26 июня 2020 г. 11:28:43(UTC)
AndrewMuravev

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.06.2020(UTC)
Сообщений: 8
Российская Федерация

Автор: Михаил Селезнёв Перейти к цитате
Поправили в новой сборке.


Установил новую сборку, перезагрузил ПК. К сожалению ничего не изменилось. Ошибка та же.
Offline Максим Коллегин  
#6 Оставлено : 26 июня 2020 г. 12:20:18(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,404
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Пароль в юникод? Сможете выложить законченный пример кода?
Знания в базе знаний, поддержка в техподдержке
Offline AndrewMuravev  
#7 Оставлено : 26 июня 2020 г. 13:21:10(UTC)
AndrewMuravev

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.06.2020(UTC)
Сообщений: 8
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
Пароль в юникод? Сможете выложить законченный пример кода?


#include <iostream>
#include <Windows.h>
#include <wincrypt.h>
#include <vector>
#include <string>
using namespace std;

int ImportPFX(string xFilePath, wstring xPassword) {
HANDLE hfile = INVALID_HANDLE_VALUE;
HANDLE hsection = 0;
void* pfx = 0;
HCERTSTORE pfxStore = 0;
HCERTSTORE hFileStore = 0;
HCERTSTORE myStore = 0;
PCCERT_CONTEXT pctx = 0;

hfile = CreateFileA(xFilePath.c_str(), FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

CRYPT_DATA_BLOB blob;
blob.cbData = GetFileSize(hfile, 0);

BYTE *fb = (BYTE*)malloc(blob.cbData * sizeof(BYTE));

DWORD dw = 0;
BOOL b1 = ReadFile(hfile, fb, blob.cbData, &dw, NULL);
cout << "b1 = " << b1 << endl;

blob.pbData = (BYTE*)fb;

BOOL b2 = PFXIsPFXBlob(&blob);
cout << "b2 = " << b2 << endl;

//pfxStore = PFXImportCertStore(&blob, xPassword.c_str(), CRYPT_EXPORTABLE | PKCS12_IMPORT_SILENT);
//pfxStore = PFXImportCertStore(&blob, xPassword.c_str(), CRYPT_EXPORTABLE);
pfxStore = PFXImportCertStore(&blob, xPassword.c_str(), PKCS12_IMPORT_SILENT);
if (!pfxStore) cout << "Error in PFXImportCertStore" << endl;

cout << "GetLastError = " << GetLastError() << endl;
cout << "pfxStore = " << pfxStore << endl;

myStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
if (!myStore) cout << "Error in 'CertOpenSystemStore'" << endl;

while (0 != (pctx = CertEnumCertificatesInStore(pfxStore, pctx))) {
char name[128];
if (!CertGetNameStringA(pctx, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, 0, name, sizeof name / sizeof *name)) cout << "Error in 'CertGetNameString'" << endl;
cout << "name = " << name << endl;

if (!CertAddCertificateContextToStore(myStore, pctx, CERT_STORE_ADD_REPLACE_EXISTING, 0)) {
DWORD err = GetLastError();

// Maybe theres another equal certificate already added
if (CRYPT_E_EXISTS == err) {
if (!CertAddCertificateContextToStore(myStore, pctx, CERT_STORE_ADD_REPLACE_EXISTING, 0)) cout << "Error in 'CertAddCertificateContextToStore'" << endl;
}else{
cout << "Error en 'CertAddCertificateContextToStore'" << endl;
}
}
}

return 1;
}

int main() {
ImportPFX("c:\\test\\Test_Token_5.pfx", L"1qwe");
cout << "Done" << endl;
getchar();
}
Offline AndrewMuravev  
#8 Оставлено : 26 июня 2020 г. 13:21:49(UTC)
AndrewMuravev

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.06.2020(UTC)
Сообщений: 8
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
Пароль в юникод? Сможете выложить законченный пример кода?


Да, пароль в Юникоде.
Offline Максим Коллегин  
#9 Оставлено : 26 июня 2020 г. 14:08:29(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,404
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
А считыватель доступный один?
Знания в базе знаний, поддержка в техподдержке
Offline AndrewMuravev  
#10 Оставлено : 26 июня 2020 г. 14:17:48(UTC)
AndrewMuravev

Статус: Новичок

Группы: Участники
Зарегистрирован: 19.06.2020(UTC)
Сообщений: 8
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
А считыватель доступный один?


Да, настроил что доступен только один реестр.

Snimok.PNG (34kb) загружен 5 раз(а).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.