Powershell 可以将字符串作为文件呈现给外部程序吗?

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 将其作为文件打开吗?

答案1

如果您可以让字符串在 PowerShell 中显示为输出,则可以将其保存到您喜欢的任何文件中,如下所示:

[COMMAND] > [OUTPUT FILE]

这会将该命令输出到 PowerShell 窗口的任何文本保存到文本文件中。然后您可以在 OpenSSL 命令中调用该文本文件。

答案2

$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)会起作用,但可能比你现在所做的更脆弱。

您也可以尝试从 PowerShell 中调用 .NET 函数来执行 XML 签名,这可能会有所帮助 https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-sign-xml-documents-with-digital-signatures

相关内容