我正在尝试编写脚本,从一个密钥和一个 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:
PowerShell 作为命令首选项:
关于命令优先权
如果您未指定路径,PowerShell 在对当前会话中加载的所有项目运行命令时将使用以下优先顺序:
- 别名
- 功能
- 命令
- 外部可执行文件(程序和非 PowerShell 脚本)
外部命令、可执行文件必须被正确调用,包括来自 PowerShell 控制台主机或 ISE 或 VSCode 的所有需要的参数引用。
• PowerShell:运行可执行文件
https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
- 直接 - 使用环境路径或本地文件夹
- 调用表达式 (IEX)
- 调用命令 (ICM)
- 召唤物品(II)
- 呼叫接线员 &
- cmd /c-使用旧的 cmd shell
- 启动流程 (start/saps)
- [诊断.进程] 开始()
- WMI Win32_Process Create() 方法
- 停止解析符号 --%
因此,请尝试按照上述指示使用下列方法之一:
$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