2009-05-18 6 views
6

Je dois télécharger et installer environ 50 listes CRL une fois par semaine et les installer sur plusieurs serveurs Windows. Le téléchargement est la partie facile, est-ce qu'il y a un moyen que je pourrais script le processus d'importation CRL?Installation par programme de la liste de révocation de certificats (CRL)

+0

Quand vous dites que le téléchargement est la partie la plus facile? Pouvez-vous partager votre technique que vous avez utilisée pour accomplir ceci. Merci – Raj

+0

@Raj à peu près chaque autorité de certification ou signataire publiera un emplacement CRL dans le cadre des métadonnées de certificat. Ouvrez le certificat en question et recherchez un champ appelé "Points de distribution CRL". Vraiment, il s'agit d'une question générale que vous devriez poser non seulement comme commentaire. – Goyuix

+0

Oui, je connais les points de distribution comme champ dans le certificat. Actuellement, j'utilise les fonctions de récupération d'objets distants, [CryptoAPI] pour récupérer des CDP. Je comprends également que si vous copiez simplement l'URL et que vous la dépassez dans le navigateur, la CRL sera téléchargée aussi. La raison pour laquelle je vous ai demandé comme commentaire est que vous avez mentionné que la récupération de CRL est la partie facile, donc j'ai supposé que vous avez quelque utilité ou quelque chose qui fera ceci pour vous. Mais évidemment, mon hypothèse était fausse. Merci d'avoir répondu. – Raj

Répondre

3

Je ne connais pas un moyen de le faire via un script. Pouvez-vous écrire du code C? Si je comprends ce que vous voulez faire, vous utiliserez la fonction CryptUiWizImport et la structure CRYPTUI_WIZ_IMPORT_SRC_INFO.

est ici un sample of code that installs a Cert; l'importation CRL correspondante est similaire.

Addendum:
This post indique que les API Win32 (tels que CryptUiWizImport) ne sont pas directement accessibles à partir de PowerShell, et décrit ensuite une solution de contournement possible: à partir du script PowerShell, générer dynamiquement et compiler le code C# qui fait la P/Invoke stuff, puis exécutez l'assembly résultant. Cela vous permettrait de faire le CryptUiWizImport strictement à partir d'un script PowerShell, même si ce serait un peu exotique.

+1

J'ai enveloppé la fonction CryptUIWizImport en tant qu'application de console C# et cela fonctionne comme un charme pour l'installation des certificats et des CRL. Merci beaucoup! – Goyuix

+1

Vous étiez intéressé à poster la source, pour aider la prochaine personne? – Cheeso

+0

Je serais vraiment intéressé par la source ... car j'ai exactement le même problème. – Mephisztoe

1

En Powershell il est un fournisseur Cert: qui représente le magasin de certificats. La manipulation s'effectue à l'aide des cmdlets standard, ce qui vous permet d'intégrer une liste de révocation quelque part. Je n'en sais juste pas assez sur la manière dont Windows traite les certificats pour les aider ici.

2

Hm. Y at-il une raison de ne pas utiliser l'utilitaire certutil.exe? Je peux importer une liste de révocation de certificats dans le magasin approprié en exécutant la commande suivante:

certutil -addstore CA <FileName>.crl 
+0

certutil ne fait pas partie d'une installation standard. Je crois que c'est seulement installé quand les services de certificat ont été installés (bien que je puisse me tromper). – Goyuix

11

Voici ma source finale (légèrement frotté au public) - mais devrait fonctionner. Je ne changerai pas la réponse acceptée, mais j'espère que cela aidera (tout comme la question et les réponses!).

Remarque: Cela importera à la fois une liste de révocation de certificats ou un certificat ordinaire dans la banque de racines de confiance LOCAL MACHINE. Changer le CERT_SYSTEM_STORE_LOCAL_MACHINE ci-dessous à CERT_SYSTEM_STORE_CURRENT_USER dans l'appel CertOpenStore va le changer pour travailler pour le magasin de l'utilisateur actuel.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
    public struct CRYPTUI_WIZ_IMPORT_SRC_INFO 
    { 
     public Int32 dwSize; 
     public Int32 dwSubjectChoice; 
     [MarshalAs(UnmanagedType.LPWStr)]public String pwszFileName; 
     public Int32 dwFlags; 
     [MarshalAs(UnmanagedType.LPWStr)]public String pwszPassword; 
    } 

    [DllImport("CryptUI.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern Boolean CryptUIWizImport(
     Int32 dwFlags, 
     IntPtr hwndParent, 
     IntPtr pwszWizardTitle, 
     ref CRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, 
     IntPtr hDestCertStore 
    ); 

    [DllImport("CRYPT32.DLL", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern IntPtr CertOpenStore(
     int storeProvider, 
     int encodingType, 
     IntPtr hcryptProv, 
     int flags, 
     String pvPara 
    ); 

    public const Int32 CRYPTUI_WIZ_IMPORT_SUBJECT_FILE = 1; 
    public const Int32 CRYPT_EXPORTABLE = 0x00000001; 
    public const Int32 CRYPT_USER_PROTECTED = 0x00000002; 
    public const Int32 CRYPTUI_WIZ_NO_UI = 0x0001; 

    private static int CERT_STORE_PROV_SYSTEM = 10; 
    private static int CERT_SYSTEM_STORE_CURRENT_USER = (1 << 16); 
    private static int CERT_SYSTEM_STORE_LOCAL_MACHINE = (2 << 16); 

    static void Main(string[] args) 
    { 
     if (args.Length != 1) 
     { 
     Console.WriteLine("Usage: certimp.exe list.crl"); 
     Environment.ExitCode = 1; 
     } 
     else 
     { 
     IntPtr hLocalCertStore = CertOpenStore(
      CERT_STORE_PROV_SYSTEM, 
      0, 
      IntPtr.Zero, 
      CERT_SYSTEM_STORE_LOCAL_MACHINE, 
      "ROOT" 
     ); 

     CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc = new CRYPTUI_WIZ_IMPORT_SRC_INFO(); 
     importSrc.dwSize = Marshal.SizeOf(importSrc); 
     importSrc.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_FILE; 
     importSrc.pwszFileName = args[0]; 
     importSrc.pwszPassword = null; 
     importSrc.dwFlags = CRYPT_EXPORTABLE | CRYPT_USER_PROTECTED; 

     if (!CryptUIWizImport(
      CRYPTUI_WIZ_NO_UI, 
      IntPtr.Zero, 
      IntPtr.Zero, 
      ref importSrc, 
      hLocalCertStore 
     )) 
     { 
      Console.WriteLine("CryptUIWizImport error " + Marshal.GetLastWin32Error()); 
      Environment.ExitCode = -1; 
     } 
     } 
    } 
    } 
} 
+1

Remarque: Vous pouvez également créer un X509Store, l'ouvrir() et transmettre sa propriété StoreHandle en tant que dernier argument à CryptUIWizImport. – voetsjoeba

+0

Remarque: Malgré ce que dit la documentation, aucun des drapeaux CRYPTUI_WIZ_NO_UI n'empêche une boîte de dialogue contextuelle demandant "Voulez-vous remplacer la liste de révocation de certificats en cours?" lorsque le magasin cible contient déjà une liste de révocation de certificats avec une durée de validité identique ou plus récente. (Testé sur Win2008 R2) – voetsjoeba

+1

Remarque: Pour une manière plus directe d'ajouter une liste de révocation de certificats à un magasin de certificats Windows que (éventuellement) passer par une interface utilisateur, vous pouvez appeler la fonction CertAddCRLContextToStore Win32 à partir de crypt32.dll. – voetsjoeba

Questions connexes