【问题标题】:Programmatically install Certificate Revocation List (CRL)以编程方式安装证书吊销列表 (CRL)
【发布时间】:2010-10-27 01:17:39
【问题描述】:

我需要每周一次下载和安装大约 50 个 CRL,并将它们安装在多个 Windows 服务器上。下载很简单,有什么方法可以编写 CRL 导入过程的脚本吗?

【问题讨论】:

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

标签: c# powershell scripting vbscript batch-file


【解决方案1】:

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

注意:这会将 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;
        }
      }
    }
  }
}

【讨论】:

  • 注意:您也可以创建一个 X509Store,Open() 它并将其 StoreHandle 属性作为最后一个参数传递给 CryptUIWizImport。
  • 注意:不管文档怎么说,CRYPTUI_WIZ_NO_UI 标志都不会阻止弹出对话框询问“你想替换当前的 CRL 吗?”当目标存储已包含具有相同或更新有效时间的 CRL 时。 (在Win2008 R2上测试)
  • 注意:要获得比(可能)通过 UI 更直接地将 CRL 添加到 Windows 证书存储的方法,您可以从 crypt32.dll 中 P/Invoke CertAddCRLContextToStore Win32 函数。
【解决方案2】:

我不知道如何通过脚本来做到这一点。 你会写C代码吗?如果我了解您想要做什么,您将使用CryptUiWizImport 函数和CRYPTUI_WIZ_IMPORT_SRC_INFO 结构。

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

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

【讨论】:

  • 我将 CryptUIWizImport 函数包装为 C# 控制台应用程序,它就像安装证书和 CRL 的魅力一样。非常感谢!
  • 您有兴趣发布源代码以帮助下一个人吗?
  • 我会对源代码非常感兴趣......因为我有完全相同的问题。
【解决方案3】:

嗯。有什么理由不使用 certutil.exe 实用程序?我可以通过运行以下命令将证书吊销列表导入适当的存储:

certutil -addstore CA <FileName>.crl

【讨论】:

  • certutil 不是标准安装的一部分。我相信只有在安装了证书服务后才会安装它(尽管我可能是错的)。
【解决方案4】:

在 Powershell 中有一个 Cert: 提供程序,它代表证书存储。操作它是通过标准 cmdlet 完成的,因此您可以在某处集成吊销列表。我只是不太了解 Windows 如何处理证书以提供进一步的帮助。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 2019-01-11
      • 2018-04-21
      • 2020-06-11
      • 2013-04-21
      • 2018-12-30
      相关资源
      最近更新 更多