У меня есть следующий код powershell, который мне нужно использовать для импорта сертификата в keyvault:
###############################################################################
<#
.SYNOPSIS
Import-KeyVaultCertificate
.DESCRIPTION
Import-KeyVaultCertificate
.PARAMETER VaultName
.PARAMETER Name
.PARAMETER Password
.PARAMETER Version
.PARAMETER DisableVersions
.NOTES
This template allows to write secrets into the KeyVault if they are not present. If they are present, the script will ignore it.
.EXAMPLE
Import-KeyVaultCertificate.ps1 -VaultName 'vaultname' -Name 'certificatename' -Password 'certificatepassword' -Thumbprint 'certificatethumbprint' -FilePath 'certificate.pfx'
.EXAMPLE
Import-KeyVaultCertificate.ps1 -VaultName 'vaultname' -Name 'certificatename' -SecurePassword (ConvertTo-SecureString -String 'certificatepassword' -AsPlainText -Force) -Thumbprint 'certificatethumbprint' -FilePath 'certificate.pfx'
#>
# ' char inc as Notepad++ language recognition does not like get-help contents
##############################################################################
[CmdletBinding(DefaultParametersetname = "String")]
param (
[Parameter(Mandatory = $true)]
[string] $VaultName,
[Parameter(Mandatory = $true)]
[string] $Name,
[Parameter(Mandatory = $true)]
[string] $Thumbprint,
[Parameter(Mandatory = $true)]
[string] $FilePath,
[Parameter(Mandatory = $true, ParameterSetName = "String")]
[string] $Password,
[Parameter(Mandatory = $true, ParameterSetName = "SecureString")]
[securestring] $SecurePassword,
[Parameter(Mandatory = $false)]
[string] $Version,
[Parameter(Mandatory = $false)]
[switch] $DisableVersions
)
begin {
$Verbose = ($PSBoundParameters['Verbose'] -eq $true) -or ($VerbosePreference -eq 'Continue')
$KeyVaultParams = @{}
if ($Version -ne $null) {
$KeyVaultParams.Add('Version', $Version)
}
}
process {
try {
$KeyVault = @(Get-AzureRmResource -ErrorAction Stop | Where-Object {($_.Name -eq $VaultName) -and ($_.ResourceType -eq 'Microsoft.KeyVault/vaults')})
if ($KeyVault.count -ne 1) {
Write-Error -Message ('KeyVault "{0}" not found - Internal Error.' -F $VaultName) -ErrorAction Stop
}
}
catch {
Write-Error -Message ('KeyVault "{0}" not found - Internal Error.' -F $VaultName) -ErrorAction Stop
}
$GetKeyVaultCertificate = Get-AzureKeyVaultCertificate -VaultName $VaultName -Name $Name @KeyVaultParams
if (($GetKeyVaultCertificate -ne $null) -and ($GetKeyVaultCertificate.Name -eq $Name) -and ($GetKeyVaultCertificate.Thumbprint -eq $Thumbprint)) {
Write-Warning -Message ('Certificate "{0}" with Thumbprint "{1}" is present in KeyVault "{2}"' -F $GetKeyVaultCertificate.Name, $GetKeyVaultCertificate.Thumbprint, $KeyVault.Name)
}
elseif (($GetKeyVaultCertificate -eq $null) -or (($GetKeyVaultCertificate -eq $null) -and ($GetKeyVaultCertificate.Thumbprint -ne $Thumbprint))) {
try {
$CatchMessage = 'Failed to upload the certificate "{0}" in key vault "{1}".'
if ($PSCmdlet.ParameterSetName -eq 'String') {
$SecurePassword = ConvertTo-SecureString -String $Password -AsPlainText -Force
}
Write-Output ($NewCertValue = Import-AzureKeyVaultCertificate -VaultName $VaultName -Name $Name -Password $SecurePassword -FilePath $FilePath -Verbose:$Verbose -ErrorAction Stop)
if ($DisableVersions) {
$CatchMessage = 'Unable to retrieve certificate "{0}" in key vault "{1}".'
(Get-AzureKeyVaultCertificate -VaultName $VaultName -Name $Name -IncludeVersions | Where-Object {$_.Enabled }) | ForEach-Object {
if ($_.Version -ne $NewCertValue.Version) {
$CatchMessage = 'Failed to disable version for certificate "{0}" in key vault "{1}" [Version: ' + $_.Version + '].'
Set-AzureKeyVaultCertificateAttribute -VaultName $VaultName -Name $Name -Version $_.Version -Enable $false -Verbose:$Verbose -ErrorAction Stop
}
}
}
}
catch {
Write-Error -Message ($CatchMessage -F $Name, $VaultName) -ErrorAction Stop
}
}
}
Если я пытаюсь его использовать, он запрашивает у меня версию, хотя я указал параметрне является обязательнымЕсли я удаляю @KeyVaultParams
, я попадаю в точку, где скрипт в сообщении catch:
'Failed to upload the certificate "{0}" in key vault "{1}".'
сделал отладку на Get-AzureKeyVaultCertificate
, и я заявляю, что сертификат не найден, чтоправильно, но он не идет на строку, чтобы импортировать его.Если я использую командлет Import-AzureKeyVaultCertificate -VaultName $VaultName -Name $Name -Password (ConvertTo-SecureString -AsPlainText -Force:$true 'xxxxxx') -FilePath 'cert.pfx'
и импортирую сертификат, в следующий раз, когда я использую сценарий, я получаю предупреждение - что я и хочу.Означает, что сертификат находится в keyvault и Thumbprint совпадает.
Итак, 2 вопроса: 1. Кажется, что версия является обязательной - как мне обойти это?2. Сертификат не импортируется, если его нет в keyvault - Почему?
Спасибо за помощь