2017-11-15 15 views
-1

개인 키로 인증서를 가져 오려고하는데 내 스크립트가 "작동 중"이지만 알 수없는 내용이 누락되었습니다.개인 키로 인증서 가져 오기

KeyVault와 대화하고 인증을 위해이 인증서를 사용하는 앱이 있습니다. 내가 그 인증서에 대한 NETWORK SERVICE 할당과 함께 수동으로 PFX을 설치하면이 인증서에 대한 암호가 잘 작동합니다. 그러나 다음 PowerShell을 사용하면 Keyset does not exist 오류가 발생합니다. 내가 인증서 관리자에서 이것을 확인하면 모든 것이 정상적으로 보인다. 분명히, UI가 뭔가 다른 일을하고있다 .. 어떤 아이디어?

편집 NETWORK SERVICE 계정을 수동으로 추가하면 정상적으로 작동합니다. 스크립트를 실행할 때 PowerShell이 ​​관리자 모드로 실행되고 있으므로 스크립트의 일부 이상한 점이 있습니까?

스크립트

cls 
$certName = "certname.pfx" 
$path = "C:\Certificates\$certName" 
$serviceAccount = 'NETWORK SERVICE' 
$permissionType = 'Read' 
$password = 'somepassword' 

try { 
    # Import the certificate maintaining the private key format 
    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 
    $cert.Import($path, $password, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet") 

    # Add the cert to personal store location 
    $store = Get-Item Cert:\LocalMachine\My 
    $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite") 
    $store.Add($cert) 
    $store.Close() 

    # Get SecurityIdentifier value from current username 
    $currentUser = New-Object System.Security.Principal.NTAccount($env:USERNAME) 
    $strSID = $currentUser.Translate([System.Security.Principal.SecurityIdentifier]) 
    $path = "$env:USERPROFILE\AppData\Roaming\Microsoft\Crypto\RSA\$($strSID.Value)\$($cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName)" 
    $acl = Get-Acl $path 
    $rule = New-Object Security.AccessControl.FileSystemAccessRule $serviceAccount, 'FullControl', Allow 
    $acl.AddAccessRule($rule) 
    Set-Acl $path $acl 

    Write-Host "Cert installed, press any key to continue" -ForegroundColor Green 
    Read-Host 
} 
catch { 
    Write-Error -Message $_ 
} 

답변 I이었다로, 단순히 여러 스토리지 플래그를 제공 같은 문제가 발생하는 다른 사람에 대한 :

$flags = @([System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"MachineKeySet", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet") 
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 
$cert.Import($path, $password, $flags) 
+0

어디서 오류가 발생합니까? – bartonjs

+0

신청서를 실행할 때. 스크립트는 잘 실행되지만 수동으로 처리 할 때 NETWORK SERVICE 계정을 올바르게 추가하지 않습니다. –

+0

예, 어느 줄/어느 단계입니까? – bartonjs

답변

0

당신은 아마를 사용하여 인증서를 가져올를 PersistKeySetMachineKeySet 여기 일을하고 어떻게 보면 당신은 LocalMachine 저장소로 추가 기계 키 집합 대

  • 을 사용자 지정하지 않고

    • 열고 PFX 있습니다.
    • 현재 사용자의 SID로 키 파일을 찾습니다.

    Windows 인증 저장소 인 AFAIK는 어떤 사용자가 키를 소유하고 있는지 기록하지 않으며이 인증서는 "사용자 키 {id}"와 쌍을 이룹니다. 그래서 그것은 기계 (공유) 키 저장소가되어야합니다.

    "키 세트가 없습니다"는 네트워크 서비스 사용자가 키 저장소에 해당 ID로 이름 지정된 키를 가지고 있지 않기 때문입니다.

    아마도 차이점은 UI가 MachineKeySet (해당)이라고 주장하는 것입니다. 이는 사용자가 LocalMachine 저장소로 가져 오는 것을 알고 있기 때문입니다.

  • +0

    두 위치를 모두 통과했습니다! 감사. –