puedo publica privada cambiar powershell permissions pfx

publica - Establecer permisos de clave privada con PowerShell



cambiar red publica a privada windows 8 (2)

El problema es cuando el X509Certificate2 se importaba mediante el método de Import() , el X509KeyStorageFlags no estaba configurado para escribir la clave privada en el almacén de claves privadas de la computadora. X509KeyStorageFlags la función para incluir el X509KeyStorageFlags apropiado.

function Add-Certificate { [CmdletBinding()] param ( [Parameter(Position=1, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$Path, [Parameter(Position=2, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$Password ) Write-Verbose -Message (''Installing certificate from path: {0}'' -f $Path); try { # Create the certificate $pfxcert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2 -ErrorAction Stop; $KeyStorageFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable -bxor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet -bxor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet; Write-Verbose (''Key storage flags is: {0}'' -f $KeyStorageFlags); $pfxcert.Import($Path, $Password, $KeyStorageFlags); # Create the X509 store and import the certificate $store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList My, LocalMachine -ErrorAction Stop; $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite); $store.Add($pfxcert); $store.Close(); Write-Output -InputObject $pfxcert; } catch { throw $_; } }

Tengo un script de PowerShell que instala el certificado pfx en el almacén de certificados de LocalMachine. La función se ve así:

function Add-Certificate { param ( [Parameter(Position=1, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$pfxPath, [Parameter(Position=2, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$pfxPassword ) Write-Host "Installing certificate" -ForegroundColor Yellow try { $pfxcert = new-object system.security.cryptography.x509certificates.x509certificate2 $pfxcert.Import($pfxPath, $pfxPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet") $store = new-object system.security.cryptography.X509Certificates.X509Store -argumentlist "MY", LocalMachine $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite"); $store.Add($pfxcert); $store.Close(); return $pfxcert } catch { throw } }

Cuando abro el Administrador de certificados para verificar la instalación, puedo ver que se ha instalado correctamente.

El siguiente paso en mi proceso es asignar permisos al certificado a una cuenta de servicio.

function Set-CertificatePermission { param ( [Parameter(Position=1, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$pfxThumbPrint, [Parameter(Position=2, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$serviceAccount ) $cert = Get-ChildItem -Path cert:/LocalMachine/My | Where-Object -FilterScript { $PSItem.ThumbPrint -eq $pfxThumbPrint; }; # Specify the user, the permissions and the permission type $permission = "$($serviceAccount)","Read,FullControl","Allow" $accessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission; # Location of the machine related keys $keyPath = $env:ProgramData + "/Microsoft/Crypto/RSA/MachineKeys/"; $keyName = $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName; $keyFullPath = $keyPath + $keyName; try { # Get the current acl of the private key # This is the line that fails! $acl = Get-Acl -Path $keyFullPath; # Add the new ace to the acl of the private key $acl.AddAccessRule($accessRule); # Write back the new acl Set-Acl -Path $keyFullPath -AclObject $acl; } catch { throw $_; } }

Esta función falla. Específicamente, esta función falla al intentar evaluar el comando Get-Acl, con el siguiente error: Get-Acl: no se puede encontrar la ruta ''C: / ProgramData / Microsoft / Crypto / RSA / MachineKeys / 59f1e969a4f7e5de90224f68bc9be536_1d508f5e-0cbc-4eca-a402-3e55947faa3b ''

Como resulta que el archivo de clave se ha instalado en mi perfil móvil C: / Users / MyUserName / AppData / Roaming / Microsoft / Crypto / RSA / S-1-5-21-1259098847-1967870486-1845911597-155499

Estoy seguro de que hay algo mal con la función Add-Certificate, pero no puedo entender de qué se trata. ¿Cómo lo obligo a instalar el archivo clave en el directorio C: / ProgramData / Microsoft / Crypto / RSA / MachineKeys?


El script proporcionado funcionó para mí (¡gracias!) Con un cambio, debido a un error de Windows (ver ¿Por qué Set-Acl en la raíz del disco intenta establecer la propiedad del "objeto"? )

Aquí está el script actualizado:

function Set-CertificatePermission { param ( [Parameter(Position=1, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$pfxThumbPrint, [Parameter(Position=2, Mandatory=$true)] [ValidateNotNullOrEmpty()] [string]$serviceAccount ) $cert = Get-ChildItem -Path cert:/LocalMachine/My | Where-Object -FilterScript { $PSItem.ThumbPrint -eq $pfxThumbPrint; }; # Specify the user, the permissions and the permission type $permission = "$($serviceAccount)","Read,FullControl","Allow" $accessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission; # Location of the machine related keys $keyPath = $env:ProgramData + "/Microsoft/Crypto/RSA/MachineKeys/"; $keyName = $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName; $keyFullPath = $keyPath + $keyName; try { # Get the current acl of the private key $acl = (Get-Item $keyFullPath).GetAccessControl # Add the new ace to the acl of the private key $acl.AddAccessRule($accessRule); # Write back the new acl Set-Acl -Path $keyFullPath -AclObject $acl; } catch { throw $_; } }