2009-10-13 5 views
3

J'ai une application C++ qui établit une connexion HTTPS avec l'un de nos serveurs. Dans mon monde idéal, je voudrais ce qui suit pour se produire:WinHttp: Comment utiliser un magasin de certificats temporaire?

  1. App commence
  2. App rend Windows confiance de CA racine du serveur (pas d'interface graphique s'il vous plaît, seulement les appels système)
  3. parle App vers le serveur, fait son travail, etc.
  4. App fait fenêtres oublier la racine du serveur CA
  5. fait

je NOT souhaite que cette autorité de certification racine soit nécessairement approuvée par d'autres applications. Par conséquent, je ne veux pas installer le système de sécurité à l'échelle du système. Je voudrais aussi si l'utilisateur n'a pas besoin de privilèges d'administrateur. Mon plan initial était de créer un magasin en mémoire (CERT_STORE_PROV_MEMORY), ajouter mon CERT à cela, puis ajouter ce magasin en mémoire à la banque du système en utilisant CertAddStoreToCollection.

Alors que tous les appels de fonction CryptoAPI réussissent, WinHttp ne l'aime pas.

Voici le squelette de ce que je fais - peut-être que quelqu'un connaît un truc? Ou peut-être que c'est en premier lieu une erreur?

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

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

Quelques notes:

  • Tout fonctionne quand j'utilise SECURITY_FLAG_IGNORE_UNKNOWN_CA de WinHttp, donc je suis assez sûr que ce soit vraiment la question.
  • J'ai déjà vu this SO question - il est proche, mais ne résout pas le problème de faire le seul certificat temporairement de confiance, tandis que l'application s'exécute.

Merci!

Répondre

2

Étant donné que vous ne souhaitez pas que d'autres applications approuvent ce certificat, vous devez effectuer vous-même une partie de la validation du certificat. Désactivez la vérification de l'autorité de certification avec l'option SECURITY_FLAG_IGNORE_UNKNOWN_CA, puis récupérez l'appel pour la connexion au serveur WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER. Dans ce rappel, récupérez le certificat avec WINHTTP_OPTION_SERVER_CERT_CONTEXT et effectuez votre validation. Annuler/Fermer la demande si ce n'est pas qui vous voulez, continuez la demande si c'est correct.

Questions connexes