Перепишите CURL в PowerShell, используя Invoke-WebRequest с несколькими сертификатами

Я использую следующую команду curl для публикации некоторых данных из IoT Thing в службу AWS IoT Core.

curl.exe --tlsv1.2 --cacert root-CA.pem --cert certificate.pem --key private.pem -X POST -d "$($Body)" "https://ats.iot.eu-west-1.amazonaws.com:8443/topics/example/1"

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

Что у меня есть до сих пор:

# Set TLS to use version 1.2 (required by AWS)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# Make the request
Invoke-WebRequest -Method POST -UseBasicParsing -Uri "https://ats.iot.eu-west-1.amazonaws.com:8443/topics/example/1" -Certificate (Get-PfxCertificate .\certificate.pem) -Body "Some example data!" -ContentType "application/json"

Вывод команды выше:

Invoke-WebRequest : The request was aborted: Could not create SSL/TLS secure channel.

Как я могу использовать ключ и сертификат корневого ЦС, поскольку я нахожусь в команде CURL?


person Arbiter    schedule 27.08.2019    source источник
comment
Должна быть возможность объединить как закрытый ключ, так и сертификат в один файл PEM — просто скопируйте и вставьте их оба вплотную в новый файл с помощью текстового редактора. Попробуйте еще раз в Powershell с объединенным файлом.   -  person Tomalak    schedule 27.08.2019
comment
@Tomalak Я не знал, что смогу, чтобы ответить на один вопрос, но, к сожалению, та же ошибка: Invoke-WebRequest : The request was aborted: Could not create SSL/TLS secure channel. Спасибо за помощь!   -  person Arbiter    schedule 27.08.2019
comment
Я не на 100% уверен, что это так работает, поэтому я разместил это как комментарий, а не как ответ. Действительно трудно сказать без более подробного сообщения об ошибке.   -  person Tomalak    schedule 27.08.2019
comment
А, понятно, и я согласился, что здесь не хватает деталей, я не знаю, как получить более точные данные об ошибках. Общий параметр -verbose не дает мне больше информации...   -  person Arbiter    schedule 27.08.2019
comment
Моим первым шагом было бы изучить результат вызова Get-PfxCertificate в объединенном файле. Это проверяется? Он говорит, что у него есть закрытый ключ? Если да, то закручивается так же, как и отдельные параметры сертификата и ключа (не уверен, что завиток поддерживает это, но есть шанс, что да).   -  person Tomalak    schedule 27.08.2019


Ответы (1)


Я получил эту работу, используя OpenSSL.exe для создания сертификата PFX, содержащего закрытый ключ и сертификат клиента (следуя совету Томалака в комментариях OP).

openssl.exe pkcs12 -export -in ..\certificate.pfx -inkey ..\private.pem.key -out ..\CertificateWithKey.pfx

Затем я смог использовать Invoke-WebRequest для связи с сервисами AWS:

Invoke-WebRequest -Method POST -UseBasicParsing -Uri $URI -Certificate (Get-PfxCertificate CertificateWithKey.pfx) -Body "{'message':'Hey hey!'}" -ContentType application/json

person Arbiter    schedule 28.08.2019