У меня есть приложение C ++, которое устанавливает соединение HTTPS с одним из наших серверов.
В моем идеальном мире я бы хотел, чтобы произошло следующее:
- Приложение запускается
- Приложение заставляет Windows доверять корневому ЦС сервера (пожалуйста, без графического интерфейса, просто системные вызовы)
- Приложение общается с сервером, работает и т.д.
- Приложение заставляет Windows забыть о корневом сервере CA
- сделано
Я НЕ хочу, чтобы этому корневому ЦС обязательно доверяли другие приложения. Поэтому я не хочу устанавливать сертификат в масштабе всей системы.
Мне также хотелось бы, чтобы пользователю не требовались права администратора.
Первоначально я планировал создать хранилище в памяти (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 - он близок, но не решает вопрос о том, чтобы сделать сертификат только временно доверенным, пока приложение работает.
Спасибо!