Программно установить список отзыва сертификатов (CRL) - PullRequest
6 голосов
/ 18 мая 2009

Мне нужно загружать и устанавливать около 50 CRL один раз в неделю и устанавливать их на несколько серверов Windows. Загрузка - самая простая часть, есть ли способ, которым я мог бы написать сценарий процесса импорта CRL?

Ответы [ 4 ]

12 голосов
/ 06 августа 2009

Вот мой последний источник (слегка вычищенный для публики) - но должен работать. Я не буду менять принятый ответ, но я надеюсь, что это поможет (как и вопрос и ответы!).

Примечание: Это приведет к импорту CRL или обычного сертификата в хранилище доверенных корней LOCAL MACHINE. Изменение значения ниже CERT_SYSTEM_STORE_LOCAL_MACHINE на CERT_SYSTEM_STORE_CURRENT_USER в вызове CertOpenStore изменит его на работу с хранилищем текущего пользователя.

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;
        }
      }
    }
  }
}
4 голосов
/ 19 мая 2009

Я не знаю, как сделать это с помощью сценария. Вы можете написать код C? Если я понимаю, что вы хотите сделать, вы будете использовать функцию CryptUiWizImport и структуру CRYPTUI_WIZ_IMPORT_SRC_INFO .

Вот пример кода, который устанавливает Cert ; соответствующий импорт списка отзыва сертификатов аналогичен.

Добавление
В этом посте указывается, что API-интерфейсы Win32 (такие как CryptUiWizImport) напрямую недоступны из PowerShell, а затем описывается возможный обходной путь: из сценария PowerShell динамически генерируйте и компилируйте код C #, который выполняет P / Invoke. вещи, а затем запустите полученную сборку. Это позволит вам делать CryptUiWizImport строго из сценария powershell, хотя это будет довольно экзотический сценарий.

3 голосов
/ 14 июля 2009

Hm. Есть ли причина не использовать утилиту certutil.exe? Я могу импортировать список отзыва сертификатов в соответствующее хранилище, выполнив следующую команду:

certutil -addstore CA <FileName>.crl
1 голос
/ 19 мая 2009

В Powershell есть поставщик Cert:, который представляет хранилище сертификатов. Управлять им можно с помощью стандартных командлетов, чтобы вы могли где-нибудь интегрировать список отзыва. Я просто не знаю достаточно о том, как Windows обрабатывает сертификаты, чтобы оказать какую-либо дополнительную помощь здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...