Представить строку текста в виде файла внешней программе?
У меня есть сценарий, который вызывает openssl для цифровой подписи элемента XML из файла XML. Не весь XML-файл, только один элемент.
openssl работает только с файлами, но не со строками или другими объектами. Итак, я получаю элемент в Powershell, экспортирую его в файл, а затем вызываю openssl для нового файла. Фрагмент:
[xml]$schema = Get-Content myFile.xml
$head = $schema.data.head.InnerXml
$head | Out-File temp.txt
./openssl.exe dgst -sha256 -sign mykey.key -passin:1234 -out sig.sig temp.txt
./openssl.exe base64 -in sig.sig -out base64sig.txt
$schema.data.signature = Get-Content base64sig.txt
Это создает два временных файла (temp.txt и base64sig.txt). И если Out-File не имеет правильных флагов, temp.txt немного отличается от XML (пробел) и, таким образом, создает другую подпись.
Я хотел бы представить переменную $ head в виде текстового файла для openssl. Это возможно? Можете ли вы сопоставить FileStream с буквенным диском, а затем использовать путь к диску, чтобы «обмануть» openssl и открыть его как файл?
$head | Set-Content temp.txt
может точно установить содержимое вашего .txt файла из содержимого переменной.
Я не знаю, как заставить openssl читать переменную как файл ... однако, согласно документации openssl, если вы не предоставляете файл, он использует стандартный ввод https://www.openssl.org/docs/manmaster/man1/openssl-dgst.html
Это возможно $head | ./openssl.exe dgst -sha256 -sign mykey.key -passin:1234 -out sig.sig
или ./openssl.exe dgst -sha256 -sign mykey.key -passin:1234 -out sig.sig $($head)
будет работать, но может быть более хрупким, чем то, что вы делаете сейчас.
Вы также можете попробовать вызвать функции .NET из PowerShell, чтобы вместо этого выполнить подпись XML, это может помочь https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-sign-xml-documents-with-digital-signatures
Если вы можете получить строку для вывода в PowerShell, вы можете сохранить ее в файл в любом месте следующим образом:
[COMMAND] > [OUTPUT FILE]
Это сохранит текст, выводимый в окно PowerShell для этой команды, в текстовый файл. Затем вы можете вызвать этот текстовый файл в своей команде OpenSSL.