2012-05-09 14 views
7

¿Hay alguna forma de invalidar inmediatamente el caché CRL (Lista de revocación de certificados) que hace que los clientes descarguen la CRL nuevamente?Invalidar caché CRL

Me gustaría lograrlo en C# sin recurrir a la línea de comando 'certutil.exe'.

Aún mejor sería ser capaz de ajustar el tiempo de invalidación (como UtcNow + 12 horas)

+0

Si su problema es solo la ventana de cmd, puede ejecutar un proceso (certutil) sin una ventana de línea de comandos visible. – Ondra

Respuesta

0

Sé que usted no desea utilizar certutil.exe pero de esta manera se puede ejecutar en su aplicación sin ventana que muestra cmd arriba, si eso era lo que no querías.

public bool ClearCRLCache() 
{ 
    var pw = new ProcessWrapper(); 
    var result = pw.Start("certutil.exe", "-urlcache * delete"); 
    // -2147024637 is the exitcode when the urlcache is empty 
    return (result == 0 || result == -2147024637); 
} 

El ProcessWrapper clase:

public class ProcessWrapper 
{ 
    /// <summary> 
    /// Output from stderr 
    /// </summary> 
    public string StdErr { get; private set; } 

    /// <summary> 
    /// Output from stdout 
    /// </summary> 
    public string StdOut { get; private set; } 

    /// <summary> 
    /// Starts a process 
    /// </summary> 
    /// <param name="command">Executable filename</param> 
    /// <returns>Process exitcode</returns> 
    public int Start(string command) 
    { 
     return Start(command, ""); 
    } 

    /// <summary> 
    /// Starts a process with commandline arguments 
    /// </summary> 
    /// <param name="command">Executable filename</param> 
    /// <param name="arguments">Commanline arguments for the process</param> 
    /// <returns>Process exitcode</returns> 
    public int Start(string command, string arguments) 
    { 
     return Start(command, arguments, ""); 
    } 

    /// <summary> 
    /// Starts a process with commandline arguments and working directory 
    /// </summary> 
    /// <param name="command">Executable filename</param> 
    /// <param name="arguments">Commanline arguments for the process</param> 
    /// <param name="workingDirectory">Working directory for the process</param> 
    /// <returns>Process exitcode</returns> 
    public int Start(string command, string arguments, string workingDirectory) 
    { 
     StdErr = ""; 
     StdOut = ""; 
     var proc = new Process(); 
     proc.StartInfo.FileName = command; 
     proc.StartInfo.Arguments = arguments; 
     proc.StartInfo.WorkingDirectory = workingDirectory; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.StartInfo.RedirectStandardError = true; 
     proc.EnableRaisingEvents = true; 
     proc.StartInfo.CreateNoWindow = true; 

     // Write messages from stderr to StdErr property 
     proc.ErrorDataReceived += (sender, e) => 
     { 
      StdErr += e.Data + Environment.NewLine; 
     }; 

     // Write messages from stdout to StdOut property 
     proc.OutputDataReceived += (sender, e) => 
     { 
      StdOut += e.Data + Environment.NewLine; 
     }; 

     proc.Start(); 

     proc.BeginErrorReadLine(); 
     proc.BeginOutputReadLine(); 

     proc.WaitForExit(); 
     return proc.ExitCode; 
    } 
} 
1

ya implemento tal solución, actualización de la caché de CRL en la máquina del cliente cada x horas, dependiendo de la configuración del planificador. Usted puede leer acerca de CRL aquí: http://social.technet.microsoft.com/wiki/contents/articles/4954.certificate-status-and-revocation-checking.aspx

CRL caché se almacena en la máquina cliente en carpetas especiales y constan de dos archivos almacenados en carpetas y metadatos de contenido. Estas carpetas se ubican en "C: \ Documents and Settings {nombre de usuario} \ Application Data \ Microsoft \ CryptnetUrlCache" y la ubicación del caché por equipo es "% WINDIR% \ System32 \ config \ SystemProfile \ Application Data \ Microsoft \ CryptnetUrlCache" . Los archivos de Cahce se nombran en la suma de hash MD5 de la URL de CRL. El archivo en la carpeta "Metadata" contiene algunos datos constantes, fecha de la última actualización, URL de CRL, tamaño de archivo CRL y otros. Y el archivo en la carpeta "Contenido" es el archivo CRL en sí y tiene el mismo nombre que el archivo de "Metadatos". Analizo el metaarchivo, verifico si no es válido y cargo el nuevo archivo CRL por URL de CRL, lo coloco en la carpeta "Contenido" y reconstruyo el archivo de metadatos. Utilizo la biblioteca BouncyCastle para estos fines. Como biblioteca de programación utilizo Quartz.Net.

Cuestiones relacionadas