WinHttp: Как использовать временное хранилище сертификатов?

У меня есть приложение 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 вопрос - он близок, но не решает вопрос о том, чтобы сделать сертификат только временно доверенным, пока приложение работает.

Спасибо!

13.10.2009 00:47:37
1 ОТВЕТ

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

2
5.11.2009 16:39:10