尝试将多个变量解析为 openssl 命令的 powershell foreach 循环

问题描述

我正在尝试利用 Powershell 使用 Openssl 自动创建一些 PFX 证书。 我正在尝试创建一个 foreach 循环,该循环使用私有 pem 密钥和颁发的证书,并使用 openssl pkcs12 命令推出 pfx 文件。 我试图创建一个对象,foreach 循环可以在该对象上获取数据,但我认为没有将正确的值解析到 openssl 命令。

$openssldir = "C:\openssl-1.1\x64\bin"
$certlocation = "C:\openssl-1.1\x64\bin\Certs"
$keylocation = "C:\openssl-1.1\x64\bin\Keys"
$pfxlocation = "C:\openssl-1.1\x64\bin\PFX"

$certs = (Get-ChildItem -path $certlocation -File).Name
$keys = (Get-ChildItem -path $keylocation -File).Name


$certpath = $certs | foreach{".\Certs\" + $_}
$keypath = $keys | foreach{".\Keys\" + $_}

set-location -Path $openssldir


$a = @()
$obj = New-Object PSObject
$obj | Add-Member -type NoteProperty -Name 'cert' -Value $certpath
$obj | Add-Member -Type NoteProperty -Name 'key' -Value $keypath


$a += $obj



ForEach($item in $a){
$pfx = $item.cert
$pfxfile = $pfx.replace(".cer",".pfx")
.\openssl.exe pkcs12 -export -out PFX/$pfxfile -inkey $item.key -in $item.cert -password pass: 
}

我可以手动运行命令,它没有问题,我什至可以使用数组中的特定条目运行命令,例如:

.\openssl.exe pkcs12 -export -out PFX/test.pfx -inkey $item.key[0] -in $item.cert[0] -password pass: 

我可能只是有一些语法错误或一些愚蠢的事情,因此感谢您的帮助!

瑞恩

解决方法

当您构建 $obj 对象时,您只会创建一个对象,其属性包含 $certpath 路径数组,另一个属性包含 $keypath 路径数组。我相信您的意图是创建包含一个匹配的 certpath 和 keypath 的单独对象。如果是这样,您需要一些额外的逻辑来进行匹配,并使用一些循环将适当的单个证书路径和密钥路径放在每个 $obj 中。

不幸的是,我无法测试此代码,但我认为它应该可以工作。 foreach 变量上的 $a 循环是与您的代码的主要区别,也是证书与密钥匹配的地方。我还将 pfx 文件名的代码移到此处。

$openssldir = 'C:\openssl-1.1\x64\bin'
$certlocation = 'C:\openssl-1.1\x64\bin\Certs'
$keylocation = 'C:\openssl-1.1\x64\bin\Keys'
$pfxlocation = 'C:\openssl-1.1\x64\bin\PFX'

$opensslExe = "$openssldir\openssl.exe"

$certs = Get-ChildItem -Path $certlocation -File
$keys = Get-ChildItem -Path $keylocation -File

$a = foreach ($cert in $certs) {
    [PSCustomObject]@{
        cert    = $cert.FullName
        key     = ($keys | 
                Where-Object( { $_.BaseName -like $cert.BaseName }) | 
                Select-Object -First 1).FullName
        pfxfile = $cert.Name.Replace('.cer','.pfx')
    }    
}

ForEach ($item in $a) {
    & $opensslExe pkcs12 -export -out "$pfxlocation/$($item.pfxfile)" -inkey $item.key -in $item.cert -password pass: 
}