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

8

我每周需要下载并安装大约50个CRL(证书吊销列表),并将它们安装在几台Windows服务器上。下载很容易,但有没有办法脚本化CRL导入过程呢?


当你说下载是容易的部分时,你能分享一下你用来完成这个任务的技巧吗?谢谢。 - Raj
@Raj,几乎每个证书颁发机构或签名者都会在证书元数据中发布CRL位置。打开相关的证书并查找名为“CRL分发点”的字段。实际上,这是一个你应该提出的一般性问题,而不仅仅是留下评论。 - Goyuix
是的,我知道证书中的分发点字段。目前我使用远程对象检索函数[CryptoAPI]从CDP中检索。我也明白,如果只是复制URL并将它们粘贴到浏览器中,CRL也会被下载。我之所以在评论中问你,是因为你提到CRL检索是容易的部分,所以我假设你有一些实用程序或其他东西可以为你完成这个任务。但显然我的假设是错误的。感谢您的回复。 - Raj
5个回答

13

这是我的最终代码(稍作修改以供公开使用)-但应该可以工作。 我不会更改已接受的答案,但我希望这可以帮助到大家(当然,也可以点赞问题和回答!)。

注意:这将同时导入CRL或常规证书到本地机器可信根存储区。 将下面的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
注意:您还可以创建一个X509Store,打开它并将其StoreHandle属性作为CryptUIWizImport的最后一个参数传递。 - voetsjoeba
注意:尽管文档中所说的CRYPTUI_WIZ_NO_UI标志之一可以防止弹出对话框询问“是否要替换当前CRL?”,但当目标存储已经包含具有相同或更新有效期的CRL时,实际上并不会生效。(在Win2008 R2上测试过) - voetsjoeba
1
注意:如果您想以比(可能)通过用户界面更直接的方式将CRL添加到Windows证书存储中,则可以从crypt32.dll中P/Invoke CertAddCRLContextToStore Win32函数。 - voetsjoeba

4

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

这里有一个安装证书的样例代码; 相应的CRL导入类似。

补充:
这篇文章指出Win32 API(例如CryptUiWizImport)不能直接从PowerShell访问,然后描述了一个可能的解决方法:在PowerShell脚本内部动态生成和编译执行P/Invoke操作的C#代码,然后运行生成的程序集。这将允许您严格从powershell脚本中执行CryptUiWizImport,尽管这可能是一个相当奇特的脚本。


1
我将CryptUIWizImport函数封装为C#控制台应用程序,它可以完美地安装证书和CRL。非常感谢! - Goyuix
1
你有兴趣发布源代码以帮助下一个人吗? - Cheeso
我对这个源代码非常感兴趣... 因为我正好有同样的问题。 - Mephisztoe

3

嗯,有没有不使用certutil.exe实用程序的原因?我可以通过运行以下命令将证书吊销列表导入到适当的存储中:

certutil -addstore CA <FileName>.crl

certutil不是标准安装的一部分。我认为只有在安装了证书服务时才会安装它(虽然我可能错了)。 - Goyuix

1
在Powershell中,有一个Cert:提供程序,它代表证书存储。通过标准cmdlet进行操作,因此您可能能够在其中某个地方集成撤销列表。我只是不了解Windows如何处理证书,无法提供更进一步的帮助。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接