微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决尝试将多个变量解析为 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: 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。