Назад | Перейти на главную страницу

Может ли Powershell представить строку как файл внешней программе?

Представить строку текста в виде файла внешней программе?

У меня есть сценарий, который вызывает 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.