установка поля в теле JSON для содержимого в файле при выполнении пост-вызова Http в PowerShell - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь установить сертификат, выданный центром сертификации Digicert. Сначала я генерирую CSR (запрос на подпись сертификата), используя скрипт Powershell. Я помещаю сгенерированный CSR в текстовый файл и удаляю все разрывы строк, пробелы и возврат каретки. Я использую следующий скрипт для этого:

$CSR > C:\Scripts\CSR.txt
$path = "C:\Scripts\CSR.txt"
(Get-Content $path -Raw).Replace("`r`n","") | Set-Content $path -Force
(Get-Content $path -Raw).Replace(" ","") | Set-Content $path -Force
(Get-Content $path -Raw).Replace("`r`n","") | Set-Content $path -Force -NoNewline

После этого я хочу сделать http-звонок в digiCert, чтобы получить идентификатор сертификата. Для этого я использую следующий скрипт:

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
$body = @"
{
 "profile_name": "XXX",
 "common_name": "XX",
 "additional_dns_names": [
   "XX",
   "XX"
 ],
 "csr":$CSRWithNoCRLF,

 "signature_hash": "sha256",
 "validity": {
   "months": 36
 },
 "organization": {
   "name": "XXX",
   "units": [

   ]
 }
}
"@


$header = @{
 "Accept"="application/json"
 "KEY"="XXXX"
 "Content-Type"="application/json"
} 

$response = Invoke-WebRequest -Uri "https://www.digicert.comXXXX" -Method Post -Body $body -Headers $header 
$Content = $response.Content

Для поля csr в теле JSON я хочу напрямую скопировать содержимое файла C: \ Scripts \ CSR.txt. Я попробовал следующий подход, но он не работает.

$CSRWithNoCRLF = Get-Content $path

И используйте $ CSRWithNoCRLF в качестве значения для csr. Но Get-Content добавляет разрывы строк и возврат каретки и искажает значение CSR. Так что это не работает. Любая идея о том, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Попробуйте это:

$CSRWithNoCRLF = (Get-Content $path -Raw).Replace("`r`n","").Replace(" ","")
$body = @"
{
 "profile_name": "XXX",
 "common_name": "XX",
 "additional_dns_names": [
   "XX",
   "XX"
 ],
 "csr":"$CSRWithNoCRLF",

 "signature_hash": "sha256",
 "validity": {
   "months": 36
 },
 "organization": {
   "name": "XXX",
   "units": [

   ]
 }
}
"@
$header = @{
 "Accept"="application/json"
 "KEY"="XXXX"
 "Content-Type"="application/json"
} 

$response = Invoke-WebRequest -Uri "https://www.digicert.comXXXX" -Method Post -Body $body -Headers $header 
$Content = $response.Content

Я не вижу необходимости сохранять сертификат в файл после его изменения.

1 голос
/ 20 марта 2019

Get-Content добавляет разрывы строк

Несколько способов, каждый из которых является законченным решением:

$CSRWithNoCRLF = Get-Content $path -Raw     # requires PSv3+

Get-Content $path | Out-String

(Get-Content $path) -join "`n"       # use "`r`n" for Windows-style line-endings

Редактировать

Изучите, что вы отправляете.Попробуйте это:

[regex]::Escape($Body)

Если вы использовали (Get-Content $path) -join " n "`, то у вас не будет \ r \ n окончаний строк в CSR-части. Однако, почему вы создаете JSON вручную? Если вы делаете это нав окне Windows в строке JSON будут строки Windows.

Попробуйте:

$Body = [pscustomobject]@{
    profile_name = "XXX"
    common_name = "XX"
    additional_dns_names = @(
        "XX",
        "XX"
    )
    csr = (Get-Content $Path) -join "`n"
    signature_hash = "sha256"
    validity = [pscustomobject]@{
        months = 36
    }
    organization = [pscustomobject]@{
        name = "XXX"
        units = @()
    }

} | ConvertTo-Json -Compress

Обратите внимание, что я использую Compress.

> [regex]::Escape($Body) -match '\\r'
False
.

Давай.

...