Невозможно «импортировать сертификат» с помощью API в PowerShell - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть самозаверяющий сертификат, который я пытаюсь импортировать в Azure Key Vault Certificate, и у меня возникают проблемы. Я делаю это не с помощью команды Import-AzKeyVaultCertificate, а с помощью API.

Мне удалось создать Ключ через маршрут API, но я не могу импортировать сертификат. К вашему сведению, это также работает, когда я делаю это по конвейеру Azure DevOps, поэтому я знаю, что принцип обслуживания не проблема.

Вот как я создаю сертификат (локально через PowerShell - все примеры здесь будет локальным, а не для Azure DevOps):

$certroopath = "C:\cert"
$location = "eastus"
$vmName = "arsmpvm"
$certname = "$vmName"
$certpassword = "P@ssw0rd1234"

$cert = New-SelfSignedCertificate -DnsName "$certname" -CertStoreLocation cert:\LocalMachine\My
$pwd = ConvertTo-SecureString -String $certpassword -Force -AsPlainText
$certwithThumb = "cert:\localMachine\my\"+$cert.Thumbprint
$filepath = "$certroopath\$certname.pfx"
Export-PfxCertificate -cert $certwithThumb -FilePath $filepath -Password $pwd
Remove-Item -Path $certwithThumb 

Вот как я импортирую сертификат через операцию POST:

$pfxcontent = Get-Content 'C:\cert\arsmpvm.pfx' -Encoding Byte
$base64Stringpfxcontent = [System.Convert]::ToBase64String($pfxcontent)

#The payload
$json_new = '{
  "value": "$base64Stringpfxcontent",
  "pwd": "$pwd",
  "policy": {
    "key_props": {
      "exportable": true,
      "kty": "RSA",
      "key_size": 2048,
      "reuse_key": false
    },
    "secret_props": {
      "contentType": "application/x-pem-file"
    }
  }
}'

$header = @{Authorization = "Bearer " + $token.access_token}
Invoke-RestMethod -Method Post -Uri "https://$kvname.vault.azure.net/certificates/$certname/import?api-version=7.0" -Body $json_new -Headers $header -ContentType "application/json"

Вот ошибка, которую я выдавал: Invoke-RestMethod : {"error":{"code":"BadParameter","message":"The specified PEM X.509 certificate content is in an unexpected format. Please check if certificate is in valid PEM format."}}

Даже если я заменю значение $base64Stringpfxcontent$json_new) на его содержимое, которое похоже на строку символов 3500, я получаю ту же проблему. Даже если я изменю $pwd на его жестко запрограммированное значение, равное P@ssw0rd1234, я получу ту же ошибку.

Ссылка взята с: https://docs.microsoft.com/en-us/rest/api/keyvault/importcertificate/importcertificate

Скриншот ошибки: enter image description here

1 Ответ

1 голос
/ 17 февраля 2020

Если вы используете $base64Stringpfxcontent и $pwd в '', они будут распознаваться как строка вместо переменной, а из do c, pwd будет string, вы не можете использовать SecureString вместо него, вам нужно передать P@ssw0rd1234 непосредственно в тело запроса.

Попробуйте приведенный ниже скрипт, он отлично работает на моей стороне.

$kvname = "joykeyvault"
$certname = "testcer123"

$pfxcontent = Get-Content 'C:\Users\joyw\Desktop\arsmpvm.pfx' -Encoding Byte
$base64Stringpfxcontent = [System.Convert]::ToBase64String($pfxcontent)

$json_new = @{
  value= $base64Stringpfxcontent
  pwd= "P@ssw0rd1234"
  policy= @{
    secret_props= @{
      contentType= "application/x-pkcs12"
    }
  }
}

$json = $json_new | ConvertTo-Json

$header = @{Authorization = "Bearer " + $token.access_token}
Invoke-RestMethod -Method Post -Uri "https://$kvname.vault.azure.net/certificates/$certname/import?api-version=7.0" -Body $json -Headers $header -ContentType "application/json"

enter image description here

Регистрация на портале:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...