我使用这样的命令:
get-pfxcertificate C:\test.pfx Enter password: *******
命令让我填写提示。但我不能在我的脚本(test.ps1 for ex)
中这样做我需要的是这样的:
get-pfxcertificate C:\test.pfx -password "123456"
或类似的东西,所以我可以运行我的脚本,而不是每次都填写提示
我非常感谢任何回复
答案 0 :(得分:14)
没有Password参数,您可以尝试使用.NET类:
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import('C:\test.pfx','123456','DefaultKeySet')
答案 1 :(得分: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
答案 2 :(得分:3)
PowerShell中现在有一个Get-PfxData
命令,用于获取证书和链。该命令包含一个带有SecureString对象的-Password
参数,因此可以避免出现提示。
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。
答案 3 :(得分:1)
感谢谢伊让我指向正确的方向。 我需要从PFX文件中获取Thumbprint,因此我使用了非持久性DefaultKeySet。 除非密钥集完全合格,否则2012 PS3下的测试将失败。 此外,导入和左括号之间的空格,即" $ cert.Import ^^(系统..."导致错误。挑剔,挑剔的解析器。
我的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
答案 4 :(得分:-2)
这也可以使用本机PowerShell而不是.NET:
$securePassword = ConvertTo-SecureString -String $strPW -Force -AsPlainText $cert = Import-PfxCertificate -FilePath $strPFX cert:\LocalMachine\My -Password $securePassword