Использование CertUtil MergePfx с паролем в качестве параметра
Я пытаюсь создать сценарий для создания одного сертификата PFX из одного ключа и одного файла pem. Следующая команда в 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 пароль» — это опция, и параметры должны быть первыми аргументами исполняемого файла 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 сообщает о представленной ошибке, потому что это не то, что ожидается.
Если вы хотите увидеть, что делает команда, вы можете использовать два командлета:
PowerShell в качестве предпочтения команды:
about_Command_Precedence
Если вы не указываете путь, PowerShell использует следующий порядок приоритета при выполнении команд для всех элементов, загруженных в текущем сеансе:
- Псевдоним
- Функция
- Командлет
- Внешние исполняемые файлы (программы и сценарии, не относящиеся к PowerShell).
Внешняя команда, исполняемые файлы должны вызываться правильно, включая все необходимые кавычки для параметров из хоста консоли PowerShell, ISE или VSCode.
• PowerShell: запуск исполняемых файлов.
https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
- Прямой — использование пути к среде или локальной папки.
- Вызов-выражение (IEX)
- Команда вызова (ICM)
- Invoke-Item (II)
- Оператор вызова и
- cmd /c — использование старой оболочки cmd
- Старт-Процесс (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