2009-05-18 12 views
6

Necesito descargar e instalar aproximadamente 50 CRL una vez por semana e instalarlas en varios servidores de Windows. La descarga es la parte fácil, ¿hay alguna forma de que pueda programar el proceso de importación de CRL?Programar la instalación de la Lista de revocación de certificados (CRL)

+0

¿Cuándo dice que la descarga es la parte fácil? ¿Puedes compartir tu técnica que usaste para lograr esto? Gracias – Raj

+0

@Raj casi todas las autoridades de certificación o signatarios publicarán una ubicación de CRL como parte de los metadatos del certificado. Abra el certificado en cuestión y busque un campo llamado "Puntos de distribución CRL". Realmente esta es una pregunta general que debes hacer, no solo dejarla como comentario. – Goyuix

+0

Sí, conozco los puntos de distribución como un campo en el certificado. Actualmente utilizo funciones de recuperación de objetos remotos, [CryptoAPI] para recuperar de los CDP. También entiendo que si solo copia la URL y las pasa en el navegador, CRL también se descargará. La razón por la que te pregunté como un comentario es que mencionaste que la recuperación de CRL es la parte fácil, así que asumí que tienes alguna utilidad o algo que hará esto por ti. Pero obviamente mi suposición era incorrecta. Gracias por responder. – Raj

Respuesta

3

No sé cómo hacerlo a través de secuencias de comandos. ¿Puedes escribir el código C? Si entiendo lo que quiere hacer, usará la función CryptUiWizImport y la estructura CRYPTUI_WIZ_IMPORT_SRC_INFO.

Aquí hay un sample of code that installs a Cert; la importación de CRL correspondiente es similar.

Addendum:
This post señala que API Win32 (tales como CryptUiWizImport) no son directamente accesibles desde PowerShell y, a continuación se describe una posible solución: desde dentro de la secuencia de comandos PowerShell, dinámicamente generar y compilar código C# que hace el P/Invoca cosas, y luego ejecuta el ensamblaje resultante. Esto le permitiría hacer el CryptUiWizImport estrictamente desde un script de powershell, aunque sería muy exótico.

+1

Envolví la función CryptUIWizImport como una aplicación de consola C# y funciona como un amuleto para instalar certificados y CRL. ¡Muchas gracias! – Goyuix

+1

¿Está interesado en publicar la fuente para ayudar a la siguiente persona? – Cheeso

+0

Estaría realmente interesado en la fuente ... porque tengo exactamente el mismo problema. – Mephisztoe

1

En Powershell hay un proveedor Cert: que representa la tienda de certificados. La manipulación se realiza a través de los cmdlets estándar, por lo que es posible que pueda integrar una lista de revocación en algún lugar. Simplemente no sé lo suficiente sobre cómo maneja Windows los certificados para que sirvan de ayuda aquí.

2

Hm. ¿Hay alguna razón para no usar la utilidad certutil.exe? Puedo importar una lista de revocación de certificados en la tienda adecuada mediante la ejecución del siguiente comando:

certutil -addstore CA <FileName>.crl 
+0

certutil no es parte de una instalación estándar. Creo que solo está instalado cuando se han instalado los servicios de certificado (aunque podría estar equivocado). – Goyuix

11

Aquí es mi fuente final (ligeramente fregados para el público) - pero debería funcionar. No cambiaré la respuesta aceptada, pero sí espero que ayude (¡como lo hace la votación de la pregunta y las respuestas!).

Nota: Esto importará una CRL o un certificado normal en la tienda LOCAL MACHINE Trusted Root. Cambiando el siguiente CERT_SYSTEM_STORE_LOCAL_MACHINE al CERT_SYSTEM_STORE_CURRENT_USER en la llamada, CertOpenStore lo cambiará para funcionar para el almacén de Usuario Actual.

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

Nota: También puede crear un X509Store, Open() y pasar su propiedad StoreHandle como último argumento para CryptUIWizImport. – voetsjoeba

+0

Nota: a pesar de lo que dice la documentación, ninguno de los indicadores CRYPTUI_WIZ_NO_UI impide que un cuadro de diálogo emergente pregunte "¿Desea reemplazar la CRL actual?" cuando la tienda objetivo ya contiene una CRL con el mismo o más nuevo tiempo de validez. (Probado en Win2008 R2) – voetsjoeba

+1

Nota: Para una forma más directa de agregar una CRL a un almacén de certificados de Windows que (potencialmente) pasar por una IU, puede P/invocar la función CertAddCRLContextToStore Win32 de crypt32.dll. – voetsjoeba

Cuestiones relacionadas