WinHttp: Как использовать временное хранилище сертификатов? - PullRequest
3 голосов
/ 13 октября 2009

У меня есть приложение C ++, которое устанавливает соединение HTTPS с одним из наших серверов. В моем идеальном мире я бы хотел, чтобы произошло следующее:

  1. Приложение запускается
  2. Приложение заставляет Windows доверять корневому ЦС сервера (пожалуйста, без графического интерфейса, просто системные вызовы)
  3. Приложение общается с сервером, работает и т.д.
  4. Приложение заставляет Windows забыть о корневом сервере CA
  5. сделано

Я НЕ хочу, чтобы этому корневому ЦС обязательно доверяли другие приложения. Поэтому я не хочу устанавливать сертификат в масштабе всей системы. Мне также хотелось бы, чтобы пользователю не требовались права администратора.

Первоначально я планировал создать хранилище в памяти (CERT_STORE_PROV_MEMORY), добавить к нему мой сертификат, а затем добавить это хранилище в памяти в системное хранилище, используя CertAddStoreToCollection.

Хотя все вызовы функций CryptoAPI успешно выполняются, WinHttp это не нравится.

Вот скелет того, что я делаю - может, кто-то знает хитрость? Или, может быть, это неправильно во-первых?

hMemStore = CertOpenStore(CERT_STORE_PROV_MEMORY, ...);
pCert = CertCreateCertificateContext(..., pCertBytes, ...);
CertAddCertificateContextToStore(hMemStore, pCert, ...);
hRootStore = CertOpenSystemStore(NULL, "ROOT");
CertAddStoreToCollection(hRootStore, hMemStore, ...);

// Then later on...
WinHttpSendRequest(...)

Несколько заметок:

  • Все работает, когда я использую SECURITY_FLAG_IGNORE_UNKNOWN_CA в WinHttp, поэтому я вполне уверен, что это действительно проблема.
  • Я уже видел этот вопрос SO - он близок, но не решает вопрос о том, чтобы сделать сертификат только временно доверенным, пока приложение работает.

Спасибо!

1 Ответ

2 голосов
/ 05 ноября 2009

Поскольку вы не хотите, чтобы другие приложения доверяли этому сертификату, вам необходимо выполнить часть проверки сертификата самостоятельно. Отключите проверку CA с параметром SECURITY_FLAG_IGNORE_UNKNOWN_CA, а затем получите обратный вызов для подключения к серверу WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER. В этом обратном вызове получите сертификат с помощью WINHTTP_OPTION_SERVER_CERT_CONTEXT и выполните проверку. Отмените / закройте запрос, если он не тот, кого вы хотите, продолжите запрос, если он правильный.

...