Tôi có thể nói rằng có, nó là khả thi. Nhưng đây sẽ là một công việc tốt và tôi nghi ngờ bất cứ ai trên một trang web Hỏi & Đáp miễn phí trên internet sẽ tình nguyện làm tất cả công việc sysadmin miễn phí này cho bạn ... điều đó nói rằng, ít nhất tôi có thể giúp bạn bắt đầu .
Có hai cách chính để tấn công điều này. Một, như bạn đã xác định, là với certutil. Bạn có thể sẽ sử dụng Powershell để viết một "trình bao bọc" xung quanh certutil.exe để cung cấp dữ liệu đầu vào và phân tích cú pháp đầu ra của nó.
Thứ hai, có các thành phần COM Dịch vụ chứng chỉ CERTENROLLib, CERTCLIENTLib, v.v. Những thứ này cho phép bạn viết kịch bản bất kỳ và tất cả các công việc có thể là thủ công, miễn là bạn sẵn sàng đưa vào nỗ lực khủng khiếp của việc viết kịch bản.
Hãy nhìn xem, anh chàng này đang sử dụng C # và các giao diện COM đã nói ở trên để tạo CSR, gửi CSR cho Cơ quan cấp chứng chỉ và nhận phản hồi và cài đặt chứng chỉ. C # dễ dàng được chuyển đến Powershell.
Thứ hai, certutil ... bạn có thể làm hầu hết mọi thứ với certutil, nhưng nó không hướng đối tượng, tất cả đều phân tích cú pháp văn bản như các công cụ Unix thế giới cũ. Ví dụ, tôi sẽ chia sẻ với bạn một tập lệnh Powershell ngắn mà tôi đã viết sử dụng certutil để quét yêu cầu chứng chỉ đang chờ xử lý trên Tổ chức phát hành chứng chỉ và thông báo cho quản trị viên nếu có bất kỳ CSR đang chờ xử lý nào cần phê duyệt.
[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
}