代码之家  ›  专栏  ›  技术社区  ›  Goyuix

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

  •  6
  • Goyuix  · 技术社区  · 15 年前

    我需要每周下载和安装大约50个CRL,并将它们安装在几个Windows服务器上。下载是很容易的部分,有没有一种方法我可以脚本的CRL导入过程?

    4 回复  |  直到 6 年前
        1
  •  3
  •   Cheeso    15 年前

    我不知道怎么用剧本来写。 你能写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,尽管这将是一个非常奇特的脚本。

        2
  •  12
  •   garyh    7 年前

    这是我的最后一个来源(对公众来说稍微有点清洗),但应该是有效的。我不会改变已接受的答案,但我确实希望这能有所帮助(就像向上投票的问题和答案一样!).

    注: 这将同时将一个CRL或一个常规证书导入本地计算机受信任的根存储。更改以下内容 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;
            }
          }
        }
      }
    }
    
        3
  •  3
  •   Mephisztoe    15 年前

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

    certutil -addstore CA <FileName>.crl
    
        4
  •  1
  •   Joey Gumbo    15 年前

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