Windows PKI:如何导入、签署/发布和导出大量 CSR?

use*_*178 8 windows pki ssl-certificate csr certificate-authority

我有很多 CSR 需要在 Windows 中签名/颁发和导出。我希望我能以某种方式对它们进行批处理(certutil 听起来它可以完成一些工作),但我不太确定我该如何去做。可行吗?

任何帮助将不胜感激。

Rya*_*ies 0

我可以说是的,是可行的。但这将是一项大量的工作,我怀疑互联网上的免费问答网站上的任何人都会自愿为您完成所有这些免费的系统管理工作......也就是说,我至少可以让您开始。

有两种主要方法可以解决这个问题。正如您已经确定的,其中之一是使用 certutil。您可能会使用 Powershell 围绕 certutil.exe 编写一个“包装器”,为其提供输入并解析其输出。

其次,还有证书服务 COM 组件 CERTENROLLib、CERTCLIENTLib 等。只要您愿意付出巨大的努力来编写脚本,这些组件就允许您编写任何或所有需要手动完成的工作。

看,这个人正在使用 C# 和前面提到的 COM 接口来创建 CSR,将 CSR 提交给证书颁发机构,然后获取响应并安装证书。C# 可以轻松移植到 Powershell。

其次,certutil...你可以用 certutil 做大多数事情,但它不是面向对象的,它都是像旧世界的 Unix 东西一样的文本解析。作为示例,我将与您分享我编写的一个简短的 Powershell 脚本,该脚本使用 certutil 扫描证书颁发机构上待处理的证书请求,并在存在任何需要批准的待处理 CSR 时提醒管理员。

[String]$CAName     = 'SERVER01\MY-ISSUING-CA'
[String]$MailFrom   = 'noreply@mydomain.com'
[String[]]$MailTo   = 'CA-Team@domain.com'
[String]$SMTPServer = 'smtp.domain.com'
$Output = certutil -view -out "Request ID, Request Submission Date, Request Common Name, Requester Name, Request Email Address, Request Distinguished Name" -Restrict "Request Disposition=9"
If ($Output[-1] -NotLike '*successfully.')
{
    Write-Error $Output
    $Body = "<p>An error occurred on $CAName while checking for pending certificate requests.</p><pre>"
    Foreach ($Line In $Output)
    {
        $Body += "$Line" + [Environment]::NewLine
    }
    $Body += "</pre>"
    Send-MailMessage -SmtpServer $SMTPServer -From $MailFrom -To $MailTo -Subject "$CAName Encountered An Error!" -Body $Body -BodyAsHtml
    Return
}

[Int]$NumberOfRequests = 0

If ([Int]::TryParse($Output[-2].Trim().Split(' ')[0], [ref] $NumberOfRequests))
{
    If ($NumberOfRequests -GT 0)
    {
        $Body = "<p>There are pending certificate requests on $CAName.</p><pre>"
        Foreach ($Line In $Output)
        {
            $Body += "$Line" + [Environment]::NewLine
        }
        $Body += "</pre>"
        Send-MailMessage -SmtpServer $SMTPServer -From $MailFrom -To $MailTo -Subject "$CAName Has Pending Requests" -Body $Body -BodyAsHtml
    }
    Else
    {
        Write-Host "No pending certificate requests found."
    }
}
Else
{
    $Body = "<p>An error occurred on $CAName while checking for pending certificate requests.</p><pre>"
    Foreach ($Line In $Output)
    {
        $Body += "$Line" + [Environment]::NewLine
    }
    $Body += "</pre>"
    Send-MailMessage -SmtpServer $SMTPServer -From $MailFrom -To $MailTo -Subject "$CAName Encountered An Error!" -Body $Body -BodyAsHtml
}
Run Code Online (Sandbox Code Playgroud)