загрузить crt в f5-ltm с помощью invoke-webrequest

Я пытаюсь загрузить сертификат ssl в REST API f5 и не нашел никого, кто использовал бы для этого powershell. Я настроил invoke-webrequest вокруг этой страницы, которая использует curl f5-Dev-central

f5 это: BIG-IP 13.1.1 Build 0.0.4 Final

я получаю следующую ошибку

Invoke-webrequest : {"code":400,"message":"Chunk byte count 8802 in Content-Range header different from received buffer length 162","originalRequestBody":

это часть скрипта:

....
#read the size of the file with the correct encoding
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
$basicAuthValue = "Basic $encodedCreds"

$file = [IO.File]::ReadAllBytes($pathtofile)
$enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$encodedfile = $enc.GetString($file)

#get range of bytes for entire file in start-end/total format
$range = "0-" + ($encodedfile.Length - 1) + "/" + $encodedfile.Length

#create parts for invoke-webrequest call 

#create header json
$headers = @{"Content-Range" = $range; Authorization = $basicAuthValue}

$uri = "https://$bigip/mgmt/shared/file-transfer/bulk/uploads/$nameofcert.crt"

$params = @{'command'="install";'name'="$nameofcert";'from-local-file'=$pathtofile}
$json = $params | ConvertTo-Json

#run the invoke
Invoke-webrequest -Method POST -uri $uri -Headers $Headers -Body $json -ContentType 'application/json'

person Don Fouts    schedule 21.12.2018    source источник
comment
У вас есть рабочий образец Curl? На первый взгляд $encodedfile выглядит немного странно. Также есть идеи, что такое длины 8802 и 162?   -  person Mike Twc    schedule 21.12.2018
comment
8802 - это общий размер файла, также известного как $encodedfile.length, не знаю, откуда взялось 162 в этой ошибке.   -  person Don Fouts    schedule 21.12.2018
comment
это может быть размер тела json, вы можете проверить? Этот скрипт предназначен для загрузки этого файла на сервер?   -  person Mike Twc    schedule 21.12.2018
comment
curl в powershell - это псевдоним для invoke-webrequest, поэтому для использования CURL мне нужно перейти в подсистему Linux или специально вызвать CURL.exe   -  person Don Fouts    schedule 21.12.2018
comment
Я имею в виду с фактическим завитком. Ваш образец и ссылка на решение для завивки, которое вы предоставляете, довольно разные. Вы использовали какой-то другой пример завитка? В любом случае, если целью является загрузка файла, байты файла должны быть в теле запроса.   -  person Mike Twc    schedule 21.12.2018
comment
@MikeTwc вот и все - я переместил 'content-range' = $range; в тело - и мне также пришлось добавить диапазон содержимого тела json в заголовок... и это сработало, если вы напишете ответ, я отмечу его как правильный   -  person Don Fouts    schedule 22.12.2018
comment
На самом деле я думал переместить байты в тело, поэтому вы решили это сами). Просто опубликуйте рабочий скрипт, чтобы другие люди могли его использовать.   -  person Mike Twc    schedule 22.12.2018


Ответы (1)


Итак, заголовок моего вопроса - загрузка crt - у меня все еще есть проблемы с созданием профиля на f5, но я решил проблемы с загрузкой файла.

другая часть, с которой я боролся, заключалась в том, чтобы получить ключ и сертификат в правильном формате, который хотел f5, поэтому я также расскажу, что я сделал для этого.

я начал с файла .pfx: (обратите внимание, что на моем сервере Windows 2016 установлен openssl)

openssl pkcs12 -in d:\pathtocert.pfx -out d:\pathtocrtfile.crt -clcerts
openssl pkcs12 -in d:\pathtocert.pfx -out d:\pathtokey.key -nocerts

чтобы получить crt из PEM в формат DER нужно использовать x509 - это требуется для f5

openssl x509 -inform pem -in d:\pathtocrtfile.crt -outform der -out d:\pathtocrtfile.crt

Хорошо, давайте загрузим файлы на f5 (я не буду использовать ftp или что-то в этом роде, а просто воспользуюсь остатком icontrol)

$site = 'donsTest'   # hard coding the name for now / could be passed in as an arg
$year = get-date -UFormat "%Y"
$nameofcert = "$site-cer-$year"
$pair = 'f5user:password'
$pathtofile = 'd:\pathtocrtfile.crt'
$keypath = 'd:\pathtokey.key'
$nameofkey = "$site-key-$year"
$nameofprofile = "$site-ssl-$year"
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
$basicAuthValue = "Basic $encodedCreds"
$bigip = 'iporURLTOF5'

####################################
#  get crt file ready for upload
####################################

хорошо, давайте поместим этот файл crt в тело нашего вызова REST

$file = [IO.File]::ReadAllBytes($pathtofile)
$enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")
$encodedfile = $enc.GetString($file)
$range = "0-" + ($encodedfile.Length - 1) + "/" + $encodedfile.Length  # you need to calculate the size of this file to use in the REST Header

$headers = @{"Content-Range" = $range; Authorization = $basicAuthValue}
$uri = "https://$bigip/mgmt/shared/file-transfer/bulk/uploads/$nameofcert"
$uploadresult = Invoke-webrequest -Method POST -uri $uri -Headers $Headers -Body $encodedfile -ContentType 'application/json' | ConvertFrom-Json
$temppath = $uploadresult.localFilePath

теперь файл залит на f5 - нам нужно установить его на f5 как сертификат

### Add new certificate on the f5 from the file you just uploaded
class cert
{
    [string]$command
    [string]$name
    [string]$fromLocalFile
}

$cert = New-Object -TypeName cert
$cert.command = "install"
$cert.name = $nameofcert 
$cert.fromLocalFile = $temppath
$body = $cert | ConvertTo-Json
$headers = @{Authorization = $basicAuthValue}
$url = "https://$bigip/mgmt/tm/sys/crypto/cert"
Invoke-WebRequest $url -method Post -Body $body -Headers $Headers -ContentType "application/json"

ключ - это тот же процесс, за исключением URL-адреса для установки ключа

$url = "https://" + $bigip + "/mgmt/tm/sys/crypto/key"
Invoke-WebRequest $url -method Post -Body $body -Headers $Headers -ContentType "application/json" -Credential $credential | ConvertFrom-Json
person Don Fouts    schedule 02.01.2019