2012-05-09 3 views
7

Есть ли способ немедленно аннулировать кэш CRL (Список отзыва сертификатов), заставляя клиенты снова загружать CRL?Invalidate CRL cache

Я хотел бы получить его на C#, не прибегая к командной строке 'certutil.exe'.

Еще лучше было бы, чтобы иметь возможность установить время недействительности (как UtcNow + 12 часов)

+0

Если ваша проблема - только окно cmd, вы можете запустить процесс (certutil) без видимого окна командной строки. – Ondra

ответ

0

Я знаю, что вы не хотите использовать certutil.exe, но таким образом, вы можете запустить его в приложении без CMD окна показа если это было то, чего вы не хотели.

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); 
} 

Класс ProcessWrapper:

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

я уже реализовать такое решение, то обновлять кэш CRL на клиентах машины каждые х часов, в зависимости от настроек планировщика. Вы можете прочитать о CRL здесь: http://social.technet.microsoft.com/wiki/contents/articles/4954.certificate-status-and-revocation-checking.aspx

кэш CRL хранятся на клиентском компьютере в специальных папках и состоят из двух файлов, сохраненных в метаданных и содержимое папок. Эти папки размещаются в папке «C: \ Documents and Settings {имя пользователя] \ Application Data \ Microsoft \ CryptnetUrlCache", а для каждого кэш-компьютера - "% WINDIR% \ System32 \ config \ SystemProfile \ Application Data \ Microsoft \ CryptnetUrlCache" , Файлы Cahce названы в хэш-сумме MD5 URL-адреса CRL. Файл в папке «Метаданные» содержит некоторые постоянные данные, дату последнего обновления, URL-адрес CRL, размер файла CRL и другие. И файл в папке «Контент» сам является файлом CRL и имеет то же имя, что и файл из «Метаданных». Я просматриваю метафайл, проверяю, недействителен ли он и загружает новый файл CRL по URL-адресу CRL, помещает его в папку «Содержимое» и перестраивает файл метаданных. Я использую библиотеку BouncyCastle для этих целей. В качестве библиотеки расписания я использую Quartz.Net.

 Смежные вопросы

  • Нет связанных вопросов^_^