7

我使用这样的命令:

获取 pfx 证书 C:\test.pfx

输入密码: *******

该命令要求我填写提示。但我不能在我的脚本中这样做(test.ps1 for ex)

我需要的是这样的:

获取-pfxcertificate C:\test.pfx -password "123456"

或类似的东西,这样我就可以运行我的脚本而无需每次都填写提示

我非常感谢任何回复

4

5 回答 5

20

没有密码参数,您可以尝试使用 .NET 类:

$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import('C:\test.pfx','123456','DefaultKeySet')
于 2012-12-27T09:42:26.577 回答
6

另一种选择是扩展 的功能Get-PfxCertificate,本质上是允许输入密码。

# create a backup of the original cmdlet
if(Test-Path Function:\Get-PfxCertificate){
    Copy Function:\Get-PfxCertificate Function:\Get-PfxCertificateOriginal
}

# create a new cmdlet with the same name (overwrites the original)
function Get-PfxCertificate {
    [CmdletBinding(DefaultParameterSetName='ByPath')]
    param(
        [Parameter(Position=0, Mandatory=$true, ParameterSetName='ByPath')] [string[]] $filePath,
        [Parameter(Mandatory=$true, ParameterSetName='ByLiteralPath')] [string[]] $literalPath,

        [Parameter(Position=1, ParameterSetName='ByPath')] 
        [Parameter(Position=1, ParameterSetName='ByLiteralPath')] [string] $password,

        [Parameter(Position=2, ParameterSetName='ByPath')]
        [Parameter(Position=2, ParameterSetName='ByLiteralPath')] [string] 
        [ValidateSet('DefaultKeySet','Exportable','MachineKeySet','PersistKeySet','UserKeySet','UserProtected')] $x509KeyStorageFlag = 'DefaultKeySet'
    )

    if($PsCmdlet.ParameterSetName -eq 'ByPath'){
        $literalPath = Resolve-Path $filePath 
    }

    if(!$password){
        # if the password parameter isn't present, just use the original cmdlet
        $cert = Get-PfxCertificateOriginal -literalPath $literalPath
    } else {
        # otherwise use the .NET implementation
        $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
        $cert.Import($literalPath, $password, $X509KeyStorageFlag)
    }

    return $cert
}

现在你可以调用它了

# tada: extended cmdlet with `password` parameter
Get-PfxCertificate 'C:\path\to\cert.pfx' 'password'

此外,如果您仍然需要提示,您可以执行以下操作。

$pwd = Read-Host 'Please enter your SSL Certificate password.'
Get-PfxCertificate 'C:\path\to\cert.pfx' $pwd
于 2015-06-02T17:41:19.070 回答
4

现在Get-PfxDataPowerShell 中有一个命令可以获取证书和链。该命令包含一个-Password采用 SecureString 对象的参数,因此您可以避免被提示。

EndEntityCertificates属性包含证书链末尾的证书数组,并将包含由Get-PfxCertificate命令创建的相同证书对象。

以下示例将普通字符串转换为 SecureString 对象,从文件加载证书,然后将第一个/唯一结束证书分配给 $SigningCert 变量:

$SecurePassword=ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$PfxData=Get-PfxData -FilePath ".\cert_filename.pfx" -Password $SecurePassword
$SigningCert=$PfxData.EndEntityCertificates[0]

您现在可以在不提示输入密码的情况下应用 $SigningCert。

于 2020-02-05T20:24:40.793 回答
2

感谢 Shay 为我指明了正确的方向。我需要从 PFX 文件中获取指纹,所以我使用了非持久性 DefaultKeySet。除非密钥集完全合格,否则 2012 PS3 下的测试将失败。此外,Import 和左括号之间的空格,即“$cert.Import^^(Sys...”会导致错误。挑剔,挑剔的解析器。

我的 PFX 密码在源代码中已加密。我在运行时解密它,所以它在源代码中不可见。

Set-StrictMode -Version Latest
[string] $strPW  = '123456'
[string] $strPFX = 'C:\MyCert.pfx'

$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($strPFX,$strPW,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"DefaultKeySet")
$cert.Thumbprint
于 2014-04-01T14:23:39.387 回答
-2

这也适用于使用本机 PowerShell 而不是 .NET:

$securePassword = ConvertTo-SecureString -String $strPW -Force -AsPlainText
$cert = Import-PfxCertificate -FilePath $strPFX cert:\LocalMachine\My -Password $securePassword
于 2014-09-08T16:27:11.233 回答