我每周需要下载并安装大约50个CRL(证书吊销列表),并将它们安装在几台Windows服务器上。下载很容易,但有没有办法脚本化CRL导入过程呢?
我每周需要下载并安装大约50个CRL(证书吊销列表),并将它们安装在几台Windows服务器上。下载很容易,但有没有办法脚本化CRL导入过程呢?
这是我的最终代码(稍作修改以供公开使用)-但应该可以工作。 我不会更改已接受的答案,但我希望这可以帮助到大家(当然,也可以点赞问题和回答!)。
注意:这将同时导入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;
}
}
}
}
}
我不知道通过脚本实现的方法。 你能编写C代码吗?如果我理解你想要做的事情,你将使用CryptUiWizImport函数和CRYPTUI_WIZ_IMPORT_SRC_INFO结构体。
这里有一个安装证书的样例代码; 相应的CRL导入类似。
补充:
这篇文章指出Win32 API(例如CryptUiWizImport)不能直接从PowerShell访问,然后描述了一个可能的解决方法:在PowerShell脚本内部动态生成和编译执行P/Invoke操作的C#代码,然后运行生成的程序集。这将允许您严格从powershell脚本中执行CryptUiWizImport,尽管这可能是一个相当奇特的脚本。
嗯,有没有不使用certutil.exe实用程序的原因?我可以通过运行以下命令将证书吊销列表导入到适当的存储中:
certutil -addstore CA <FileName>.crl
Cert:
提供程序,它代表证书存储。通过标准cmdlet进行操作,因此您可能能够在其中某个地方集成撤销列表。我只是不了解Windows如何处理证书,无法提供更进一步的帮助。我们必须只使用Win32 API来完成这个任务。没有一流的C#系统API可以做到这一点。请参考https://stackoverflow.com/a/67814697/3671594