Existe-t-il une API permettant de pré-récupérer la liste des certificates racine de confiance sous Windows?

J’utilise Python et OpenSSL pour me connecter à un site en utilisant TLS (dans certains logiciels multi-plateformes, il serait donc trop difficile de passer à CryptoAPI pour tout). Je ne souhaite pas dissortingbuer (et mettre à jour) une liste personnalisée de certificates. Je veux les obtenir de la plateforme. Sous OS X et Linux, c’est assez simple, mais Windows est fourni avec une liste incomplète des autorités de certificateion racine approuvées pour TLS; simplement les propres certificates de Microsoft, puis ajoute dynamicment des racines de confiance au magasin lorsque des éléments TLS de haut niveau (comme le chargement d’une page Web dans Internet Explorer sur HTTPS) doivent vérifier une racine de confiance qu’il n’a jamais vue auparavant. (Ce processus est expliqué ici.) Cela signifie que je peux énumérer le magasin de certificates racine Windows avec wincertstore , mais il est inutile car sur les machines avec des systèmes d’exploitation installés plus récemment, ce magasin sera presque vide.

Microsoft fournit des instructions détaillées aux administrateurs pour pré-extraire cette liste afin de pouvoir utiliser des machines avec un access réseau étroitement contrôlé; Cependant, je ne trouve aucune référence à une API qui fera la même chose, et il suffit de télécharger tous les certificates racine de confiance de Microsoft. (Honnêtement, à l’ère des mises à jour hebdomadaires de plusieurs mégaoctets, je ne vois pas pourquoi le pré-téléchargement est si important, s’il ne s’agit que d’un cache; pour les points bonus, veuillez expliquer pourquoi.)

Donc: existe-t-il une API qui me permettrait d’indiquer au système de pré-mettre en cache les certificates racine de confiance en fonction des règles utilisées? A défaut, si c’est vraiment impossible (c.-à-d. Si CryptoAPI ne peut télécharger qu’une seule racine de confiance à la fois et seulement si vous lui donnez un certificate signé par cette racine), y at-il un moyen de la vérification téléchargera et mettra en cache les racines de confiance comme le ferait une connexion TLS native?

    Ce n’est pas une approche idéale, mais cela devrait se faire à la rigueur et cela pourrait vous donner un sharepoint départ. Ce code utilisera le fichier .sst généré par certutil -generateSSTFromWU et appenda tous les certificates au magasin racine:

     #include  #include  #pragma comment(lib, "crypt32.lib") #include  void process_cert(PCCERT_CONTEXT cert) { PCCERT_CHAIN_CONTEXT ccc; CERT_CHAIN_PARA ccp = {sizeof(CERT_CHAIN_PARA)}; DWORD flags; char certname[256]; CertGetNameSsortingngA(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, certname, _countof(certname)); flags = 0; if (!CertGetCertificateChain(HCCE_LOCAL_MACHINE, cert, NULL, NULL, &ccp, flags, NULL, &ccc)) { printf("Certificate %s CertGetCertificateChain: %u\n", certname, GetLastError()); } else { printf("Certificate %s : %x (%x)\n", certname, ccc->TrustStatus.dwErrorStatus, ccc->TrustStatus.dwInfoStatus); } } void mainfn(void) { HCERTSTORE sst; PCCERT_CONTEXT cert; DWORD count; sst = CertOpenStore(CERT_STORE_PROV_FILENAME_W, 0, (HCRYPTPROV)NULL, CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG, L"c:\\downloads\\roots.sst"); if (sst == NULL) { printf("CertOpenStore: %x\n", GetLastError()); return; } for (cert = NULL, count = 0; cert = CertEnumCertificatesInStore(sst, cert); count++) process_cert(cert); { DWORD err = GetLastError(); if (err != CRYPT_E_NOT_FOUND) { printf("CertEnumCertificate: %u\n", err); return; } } } int main(int argc, char ** argv) { mainfn(); return 0; } 

    Dans votre contexte, vous pouvez également préférer utiliser directement les certificates racine dans le fichier .sst sans les append au magasin racine. (Dans ce cas, vous devez probablement énumérer le magasin racine ainsi que le fichier .sst, de manière à inclure tous les certificates ajoutés localement.)