使用 CertUtil MergePfx 并以密码作为参数

使用 CertUtil MergePfx 并以密码作为参数

我正在尝试编写脚本,从一个密钥和一个 pem 文件生成单个 pfx 证书。Powershell 中的以下命令将按预期生成 .pfx:

CertUtil -MergePFX $srcPemPath $outPfxPath

但是它提示我手动输入私钥密码。如果我不必手动输入,那就太方便了。

看看Microsoft 文档 我应该能够将密码作为可选的扩展属性参数提供,但是当我尝试以下操作时:

CertUtil -MergePFX $srcPemPath $outPfxPath -p $certPassword

我收到一个错误:

Expected no more than 3 args, received 4
CertUtil: Too many arguments

使用提示和文档都没有明确说明应该如何做到这一点。这可能吗?如何做到?

更新

这似乎纯粹是我对 certutil.exe 用法的理解问题:“-p password”是一个选项,选项应该是 certutil 可执行文件的第一个参数。例如,-f 和 -v 也分别是强制覆盖和详细输出的选项。

假设当前工作目录仅包含 fullchain1.pem 和 fullchain1.key:

在 powershell 中:certutil -f -v -mergepfx .\fullchain1.pem .\testout.pfx

上述代码创建了 testout.pfx,覆盖了所有现有文件,详细地写入了算法和公钥,并提示用户输入密码

在 powershell 中: certutil -p "pass1" -mergepfx .\fullchain1.pem .\testout.pfx

上述创建了 testout.pfx(假设它不存在),但仍会提示用户输入密码

在 powershell 中: certutil -p "pass1,pass2" -mergepfx .\fullchain1.pem .\testout.pfx 上面创建了 testout.pfx,没有提示用户输入密码,testout.pfx 的私钥密码将是 pass2。pass1 和 pass2 是任意的,pass1 似乎没有任何用处。

所以我有一个解决方案,但了解原因还是很好:)

答案1

任何带有开关的外部命令都可能无法被 PowerShell(consolehost 或 ISE 或 VSCode 控制台)完全理解,因为 PowerShell 不知道这些是什么,并且会出错或忽略它们,从而不会传递它们。

PowerShell 无法解释这是什么,因此只能将其按原样发送,因此 certutil 会提示出现错误,因为这不是预期的。

如果要查看命令正在执行的操作,可以使用两个 cmdlet:

  1. 调用脚本分析器
  2. 追踪命令

PowerShell 作为命令首选项:

关于命令优先权

如果您未指定路径,PowerShell 在对当前会话中加载的所有项目运行命令时将使用以下优先顺序:

  1. 别名
  2. 功能
  3. 命令
  4. 外部可执行文件(程序和非 PowerShell 脚本)

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_command_precedence?view=powershell-7

外部命令、可执行文件必须被正确调用,包括来自 PowerShell 控制台主机或 ISE 或 VSCode 的所有需要​​的参数引用。

• PowerShell:运行可执行文件

https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

  1. 直接 - 使用环境路径或本地文件夹
  2. 调用表达式 (IEX)
  3. 调用命令 (ICM)
  4. 召唤物品(II)
  5. 呼叫接线员 &
  6. cmd /c-使用旧的 cmd shell
  7. 启动流程 (start/saps)
  8. [诊断.进程] 开始()
  9. WMI Win32_Process Create() 方法
  10. 停止解析符号 --%

因此,请尝试按照上述指示使用下列方法之一:

$CMD = 'SuperApp.exe'
$arg1 = 'filename1'
$arg2 = '-someswitch'
$arg3 = 'C:\documents and settings\user\desktop\some other file.txt'
$arg4 = '-yetanotherswitch'
 
& $CMD $arg1 $arg2 $arg3 $arg4

或者 ...

$AllArgs = @('filename1', '-someswitch', 'C:\documents and settings\user\desktop\some other file.txt', '-yetanotherswitch')
& 'SuperApp.exe' $AllArgs

相关内容