Использование 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 сообщает о представленной ошибке, потому что это не то, что ожидается.

Если вы хотите увидеть, что делает команда, вы можете использовать два командлета:

  1. Invoke-ScriptAnalyzer
  2. Команда трассировки

PowerShell в качестве предпочтения команды:

about_Command_Precedence

Если вы не указываете путь, 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. Invoke-Item (II)
  5. Оператор вызова и
  6. cmd /c — использование старой оболочки cmd
  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
Другие вопросы по тегам