以编程方式安装证书吊销列表(CRL)

时间:2009-05-18 14:22:27

标签: c# powershell scripting vbscript batch-file

我需要每周下载并安装大约50个CRL,并将它们安装在多个Windows服务器上。下载是一个简单的部分,有没有办法编写CRL导入过程的脚本?

5 个答案:

答案 0 :(得分:12)

这是我的最终来源(稍微为公众擦洗) - 但应该有效。我不会改变已接受的答案,但我希望这会有所帮助(就像提出问题和答案一样!)。

注意:这会将CRL或常规证书导入LOCAL MACHINE受信任的根存储中。在CertOpenStore调用中将以下CERT_SYSTEM_STORE_LOCAL_MACHINE更改为CERT_SYSTEM_STORE_CURRENT_USER会将其更改为适用于当前用户存储。

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 :(得分:3)

我不知道通过脚本的方法。 你能写C代码吗?如果我理解你想要做什么,你将使用CryptUiWizImport函数和CRYPTUI_WIZ_IMPORT_SRC_INFO结构。

这是一个sample of code that installs a Cert;相应的CRL导入类似。

<强>附录
This post指出Win28 API(例如CryptUiWizImport)无法直接从PowerShell访问,然后描述了一种可能的解决方法:从PowerShell脚本中动态生成和编译执行P / Invoke内容的C#代码,以及然后运行生成的程序集。这将允许您严格地从powershell脚本执行CryptUiWizImport,尽管它将是一个非常奇特的。

答案 2 :(得分:3)

嗯。有没有理由不使用certutil.exe实用程序?我可以通过运行以下命令将证书吊销列表导入相应的商店:

certutil -addstore CA <FileName>.crl

答案 3 :(得分:1)

在Powershell中,有一个Cert:提供程序代表证书存储区。操作它是通过标准cmdlet完成的,因此您可以在某处将撤销列表集成在一起。关于Windows如何处理证书以获得更多帮助,我还不太了解。

答案 4 :(得分:0)

我们必须仅使用 Win32 API 来执行此操作。没有一流的 C# 系统 API 可以做到这一点。参考https://stackoverflow.com/a/67814697/3671594