Как импортировать сертификат компьютера в хранилище личных сертификатов, связанных со службой Windows? - PullRequest
1 голос
/ 18 января 2011

Я репостирую мой вопрос с форумов MSDN здесь.

Эта проблема связана с импортом сертификата в хранилище личных сертификатов, связанных со службой Windows.

Имя моей машины: il-mark-lap (машина может пинговать это имя).

Процесс:

1. Существует самозаверяющий сертификат органа, назовем его NCCA . Его закрытый ключ находится на другой машине, давайте назовем его dev-profiler .

dev-profiler> makecert -n "CN=NCCA" -sr localmachine -ss root -a sha1 -cy authority -r -sv NCCA.pvk NCCA.cer

2. Сертификат машины il-mark-lap создается на dev-profiler и импортируется в LocalComputer \ My магазин сертификатов на il-mark-lap . Обратите внимание, что сертификат полномочий ( NCCA ) должен быть перемещен в LocalComputer \ Root хранилище сертификатов, но, поскольку я не знаю, как перемещать, я использую export-delete-import последовательность.

dev-profiler> makecert -n "CN=il-mark-lap" -sr CurrentUser -ss My -cy end -pe -sky exchange -a sha1 -is Root -ir LocalMachine -in NCCA
dev-profiler> certutil -user -exportpfx -p 123 il-mark-lap il-mark-lap.pfx
dev-profiler> certutil -user -delstore My il-mark-lap

il-mark-lap> cscript CStore.vbs import -l LM -s My -e il-mark-lap.pfx 123
il-mark-lap> cscript CStore.vbs export -l LM -s My -subject NCCA NCCA.cer
il-mark-lap> cscript CStore.vbs delete -noprompt -l LM -subject NCCA My
il-mark-lap> cscript CStore.vbs import -l LM -s Root NCCA.cer

3. Сертификат компьютера il-mark-lap скопирован из LocalComputer \ My хранилище сертификатов в MSMQ \ My сертификат хранилище (служба очереди сообщений, личный магазин сертификатов). Опять же, я не знаю, как копировать, поэтому я использую последовательность экспорта-импорта.

il-mark-lap> cscript CStore.vbs export -l LM -s My -subject il-mark-lap tmp.pfx
il-mark-lap> ImportPfxIntoSrvCertStore MSMQ tmp.pfx 123

Где ImportPfxIntoSrvCertStore - моя программа, написанная на C ++ для импорта указанного PFX в хранилище личных сертификатов данной службы, в моем случае MSMQ.

Опуская всю обработку ошибок, соответствующий код C ++ выглядит так:

CSafeHandle pfxFileHandle(::CreateFile(wszPfxFilePath, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0));
CSafeHandle pfxFileMapping(::CreateFileMapping(pfxFileHandle, 0, PAGE_READONLY, 0, 0, 0));
CSafeMapViewOfFile pfxFileBuffer(::MapViewOfFile(pfxFileMapping, FILE_MAP_READ, 0, 0, 0));

CRYPT_DATA_BLOB blob;
blob.cbData = ::GetFileSize(pfxFileHandle, 0);
blob.pbData = LPBYTE(LPVOID(pfxFileBuffer));

CSafeCertStoreHandle pfxStore(::PFXImportCertStore(&blob, wszPassword, CRYPT_MACHINE_KEYSET | CRYPT_EXPORTABLE));
CSafeCertStoreHandle serviceStore(::CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_SERVICES, wszCertificateStoreName));

PCCERT_CONTEXT pctx = NULL;
while (NULL != (pctx = ::CertEnumCertificatesInStore(pfxStore, pctx)))
{
 ::CertAddCertificateContextToStore(serviceStore, pctx, CERT_STORE_ADD_REPLACE_EXISTING, NULL);
}

Игнорировать классы CSafeXXXHandle и CSafeMapViewOfFile, это простые держатели дескриптора / буфера, освобождающие соответствующий дескриптор / буфер в деструкторе (шаблон проектирования «получение ресурсов - инициализация»).

В любом случае API PFXImportCertStore завершается ошибкой с сообщением Произошла ошибка во время операции кодирования или декодирования . Если я вызываю PFXIsPFXBlob API, он возвращает FALSE.

Вот представление отладчика Locals в начале кода:

+        wszPfxFilePath    0x00774e0c "tmp.pfx"    const wchar_t *
+        wszCertificateStoreName    0x002cf7f4 "MSMQ\My"    const wchar_t *
+        wszPassword    0x00774e1c "123"    const wchar_t *

Итак, все параметры кажутся правильными.

Понятия не имею, что не так. Импортируемый файл PFX абсолютно корректен, поскольку он безупречно импортируется с помощью консоли MMC.

Кстати, мой код основан на примере из этой статьи - http://www.codeguru.com/Cpp/I-N/internet/security/article.php/c6211

Редактировать

Я хотел бы подчеркнуть, что мне нужна неинтерактивная процедура для копирования сертификата компьютера из LocalComputer \ My в MSMQ \ My.

1 Ответ

1 голос
/ 19 января 2011

Вместо использования программы я бы попытался использовать плагин mmc для хранилища сертификатов:

  • Start mmc.exe, это даст вам MMC в режиме авторизации.
  • НажмитеФайл -> Добавить / удалить оснастку
  • Найти и дважды щелкнуть «Сертификаты».Появится диалоговое окно, в котором вы можете выбрать, какое хранилище сертификатов вы хотите администрировать.
  • Я думаю, что «Сервисная учетная запись» является подходящим выбором для вас здесь
  • Нажмите далее
  • Выберите local, если вы уже находитесь на il-mark-lap, в противном случае выберите «Другой компьютер».AFAIK, вам нужно будет войти в систему с учетной записью администратора домена, чтобы это работало.
  • Нажмите далее
  • Выберите службу
  • нажмите кнопку "Готово".

На этом этапе вы уже должны иметь доступ к хранилищу сертификатов для вашего сервиса.Если вы хотите делать это чаще, я предлагаю вам сделать это также:

  • Щелкните правой кнопкой мыши «Сертификаты» в дереве и выберите «Новое окно отсюда»
  • Переключитьвернуться к корневому окну консоли и закрыть его
  • Сохранить произведение искусства в MSC-файле

Редактировать

Перед сохранением выберите «Сертификаты» издерево, а затем View -> Options.Здесь вы можете выбрать «Хранилища физических сертификатов», если хотите.

...