logo Наши способы организации безопасного удалённого доступа к рабочим местам и корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline oops1  
#1 Оставлено : 31 марта 2020 г. 10:13:35(UTC)
oops1

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Работаю из кода с сертификатами, нужно экспортировать файл pfx

Такой код генерирует pfx, но генерирует его без закрытого ключа

Код:

                  try
                    {
                        Marshal.StructureToPtr(data, pfx, false);
                        if (!WinCrypt32.PFXExportCertStoreEx(store, pfx, passwordPfx, IntPtr.Zero,
                            WinCrypt32.EXPORT_PRIVATE_KEYS /*| WinCrypt32.PKCS12_INCLUDE_EXTENDED_PROPERTIES |
                            WinCrypt32.REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY | WinCrypt32.REPORT_NO_PRIVATE_KEY*/))
                        {
                            Log.Warn("Не удалось выполнить экспорт pfx, Ошибка {0}", Marshal.GetLastWin32Error());
                            return null;
                        }

                        if (data.pbData != IntPtr.Zero)
                        {
                            var buffer = new byte[data.cbData];
                            Marshal.Copy(data.pbData, buffer, 0, (int)data.cbData);
                            Log.Trace("Сформирован PFX файл");
                            return buffer;
                        }
                        Log.Warn("Сформировать PFX файл не удалось");
                        return null;
                    }
                    finally
                    {
                        Marshal.FreeHGlobal(data.pbData);
                    }


Такой код генерирует PFX c закрытым ключем
Код:

  var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            var certs = store.Certificates.Find(X509FindType.FindBySerialNumber, "48685f008fabc7b041536dab124ef2f3", false)[0];

            var s = certs.Export(X509ContentType.Pkcs12, "1");


Но он привод к появлению окна ввода пароля

окно


Как из кода или установить пароль или сохранить пароль на контейнер

Консольная утилита
certmgr.exe -export -pfx -dest "c:\temp\1\cert.pfx" -pin 1
также запрашивает пароль на контейнер

Версия КриптоПро CSP 4.0.9963

Отредактировано пользователем 31 марта 2020 г. 13:43:41(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#2 Оставлено : 1 апреля 2020 г. 17:37:14(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 17 раз
Поблагодарили: 578 раз в 519 постах
Продублирую ответ из почты:
Параметр -pin и второй параметр в методе Export задают пароль для результирующего pfx, а не для исходного контейнера.
Задачу можно решить, добавив пин-код в ссылку на ключ сертификат в параметры PCRYPT_KEY_PROV_PARAM в CRYPT_KEY_PROV_INFO
Код:
            size_t dwLen = strlen(szPassword) + 1;
            stProvInfo.cProvParam = 1;
            stProvInfo.rgProvParam = &key_prov_param;               
            key_prov_param.dwFlags = 0;
            key_prov_param.dwParam = PP_KEYEXCHANGE_PIN;
            key_prov_param.pbData = (BYTE *) szPassword;
            key_prov_param.cbData = (DWORD)dwLen;


Тогда при экспорте вызовется CryptAcquireCertificatePrivateKey и пин-код применится.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.