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

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

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

任何帮助将不胜感激。

答案1

查看公钥基础设施 PowerShell 模块.Approve-CertificateRequest 和 Receive-Certificate 命令可以帮助您。

答案2

我可以说是的,这是可行的。但这将是一项艰巨的工作,而且我怀疑互联网上的免费问答网站上是否有人会自愿为您做所有这些免费的系统管理工作……话虽如此,我至少可以帮您入门。

有两种主要方法可以解决这个问题。一种,正如您已经确定的,是使用 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   = '[email protected]'
[String[]]$MailTo   = '[email protected]'
[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
}

相关内容