2014-12-08 10 views
1

Я пытаюсь продлить сертификат с использованием COM-библиотек CertEnroll и CertLib в PowerShell. Вот мой код:Удаленное обновление сертификата с помощью CertEnroll

[CmdletBinding()] 
param(
[parameter (mandatory=$true)] 
[string]$ServerName 
) 

$credential = Get-Credential 

Invoke-Command -ComputerName $ServerName -Credential $credential -ScriptBlock{ 

$location=[System.Security.Cryptography.X509Certificates.StoreLocation]::CurrentUser 
$store =New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $location 
$store.Open(1) 
$cert = $store.Certificates.Find([System.Security.Cryptography.X509Certificates.X509FindType]::FindByIssuerName,"<CA-Name>",$false)[0] 
#Write-Output $cert.IssuerName 
$store.Close() 
$request = New-Object -ComObject X509Enrollment.CX509CertificateRequestPkcs7 
try{ 
$request.InitializeFromCertificate(0x2,$true,[System.Convert]::ToBase64String($cert.RawData),0x1,3 -band 1024) 

$enroll = New-Object -ComObject X509Enrollment.CX509Enrollment 
$enroll.InitializeFromRequest($request) 

$message = $enroll.CreateRequest(1) 

$certReq = New-Object -ComObject CertificateAuthority.Request 
$val=$certReq.Submit(0x1 -bor 0,$message,[string]::Empty,"<CA-Server>\"+ $cert.Issuer.Split('=')[1]) 

if($val -eq 3) 
{ 
    Write-Host "Certificate request accepted" 
} 
$reqid=$certReq.GetRequestId() 
#$reqid=[System.Convert]::ToInt32($id) 
$objcertRequest = New-Object -ComObject CertificateAuthority.Request 
$pending = $objcertRequest.RetrievePending($reqid,"<CA-Server>"+$cert.Issuer.Split('=')[1]) 
if($pending -eq 3) 
{ 
     $certificate = $objcertRequest.GetCertificate(0x1 -bor 0x100); 
     $objEnroll = New-Object -ComObject X509Enrollment.CX509Enrollment 
     $objEnroll.Initialize(1); 
     $objEnroll.InstallResponse(4,$certificate,1,$null); 
     Write-Host "Installed Successfully" 
} 
else 
{ 
    Write-Error 'error' 
} 
} 
catch 
{ 
Write-Output $_.Exception.Message 
Write-Output $_.Exception.ItemName 
} 
} 

Я дал правильные значения для CA-сервера и имени CA. Я могу обновить сертификаты на своей локальной машине, но я получаю ошибку, когда пытаюсь сделать это для сертификата на другом компьютере. Это ошибка, я получаю:

Exception calling "InitializeFromCertificate" with "5" argument (s): "CertEnroll::CX509CertificateRequestPkcs7::InitializeFromCertificate: The operation being requested was not performed because the user has not been authenticated. 0x800704dc (WIN32: 1244)" 

Может кто-нибудь сказать мне, почему я получаю сообщение об ошибке аутентификации. Я предоставляю правильные учетные данные.

ответ

1

Вы предоставили учетные данные для аутентификации на удаленном хосте, однако эти учетные данные не используются для аутентификации на сервере CA. Вы должны либо:

  1. сделать удаленный компьютер в качестве доверенных для делегирования (не рекомендуется)
  2. использование CredSSP, чтобы разрешить эти учетные данные для проверки подлинности на сервере ЦС. Дополнительная информация: Enable PowerShell "Second-Hop" Functionality with CredSSP
+0

Большое спасибо за информацию. Использование CredSSP работало для меня. – Sridhar