我正在使用企业 PKI 管理单元来诊断和检查 MSFT PKI 系统的健康状况。
有什么方法可以编写脚本/自动化此工具来提醒我 CRL 即将到期或缺少 AIA?
答案1
不,PKIView.msc 不提供任何自动化手段/功能。您必须编写自己的脚本。我建议(抱歉,没有实际代码,但有一种方法可以做到这一点)考虑以下计划和可能的工具(假设您将使用 Windows PowerShell):
- 枚举所有企业证书颁发机构(通过使用ICert配置界面)
- 循环遍历每个 CA 并检索最新的 CA Exchange 证书(ICertAdmin::获取CA属性在参数
CR_PROP_CAXCHGCERT
内PropId
) - 使用X509Chanin.Build()方法为每个 CA Exchange 证书构建链。这将为您提供所有要检查的证书。
- 循环遍历每个证书并使用获取对象地址从 CDP 和 AIA 扩展中提取 URL 的函数。
- 使用调用 Web 请求cmdlet 尝试从上一步收集的 URL 下载对象。
- 报告任何失败的下载。如果下载成功,您可以设置阈值来警告即将过期或已过期的项目。
有很多方法,但我会选择这个(我计划明年研究这个问题,所以这是可能的)。
最后的建议是:如果您正在寻找可靠的解决方案,请不要依赖 certutil 输出解析,因为它的输出取决于许多因素,可能不是您期望的。
此外,如果你使用PowerShell PKI 模块。该模块已经提供了枚举企业 CA、以托管方式读取 CRL、检索 CA Exchange 证书等方法。
更新 2014.12.26:该脚本的 PoC 现已可用:企业 PKI (pkiview.msc) PowerShell 版本 (PoC)
答案2
当某些事情出现问题时,MMC 将显示红色/黄色图标,但它是一个交互式控制台,没有自动化功能。我使用 powershell 调用 CERTUTIL CLI 命令来检查是否过期,并使用invoke-webrequest 来测试 AIA 的可用性。
gci \\servername\certenroll\*.crl | foreach {
certutil -dump $_.fullname | out-string | % { $_ -match "Next CRL Publish\r\n\s+(.*)" | out-null }
$expire = [datetime]$matches[1]
$expire
# do some date math on $expire
# send some email if about to expire
}
$aia = "http://pki.acme.com/acme.crt"
if ( (invoke-webrequest $aia).statuscode -ne 200) {
# not found, send-mailmessage
}