使用Get-PfxCertificate自动签署powershell脚本

时间:2010-02-23 16:18:44

标签: powershell certificate

我必须使用来自远程计算机的证书对远程脚本进行签名。我有一个.pfx文件。

我想通过以编程方式为Get-PfxCertificate提供密码来自动化脚本。

所以问题是:

是否有可能以某种方式以编程方式提供所需的密码

GET-PfxCertificate?

3 个答案:

答案 0 :(得分:5)

$CertPath = "my.pfx"
$CertPass = "mypw"
$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertPath, $CertPass)
Set-AuthenticodeSignature -Certificate $Cert -TimeStampServer http://timestamp.verisign.com/scripts/timstamp.dll -FilePath $OutputFilename

确保您具有适当的权限,否则您将无法创建X509Certificate2对象的实例。

答案 1 :(得分:1)

我做了一些检查,并找不到以编程方式提供密码的简洁方法。出于安全考虑,我怀疑这是出于这种方式。或者PowerShell开发团队通过不包括此cmdlet的Credential参数来吹响它。我能想到的唯一另一个选择是使用像SendKeys这样的东西,通过后台工作在适当的时间将个人密码字符键按下发送到PowerShell控制台(blech - 只是在我嘴里吐了一点)。 : - )

答案 2 :(得分:1)

另一种方法是使用PS提供程序直接从证书存储区加载证书。使用 Get-PSProviders 确定计算机上的可用PSProviders。 加载证书提供程序后,您现在可以使用Get-ChildItem

获取证书

从运行中启动 certmgr.msc 以启动证书存储

假设您的证书存储在证书库中的 Personal 文件夹中,并且具有" 公司名称"在证书的subject属性中设置,并且该主题中只有公司名称的证书 - 您可以获得这样的证书

$my_cert = Get-ChildItem cert:\CurrentUser\My | ? {$_.Subject -match "Company Name"}

$ my_cert将是您可以直接传递给 Set-AuthenticodeSignature cmdlet的证书对象

Set-AuthenticodeSignature -Certificate $my_cert -FilePath fqn_to_dll.dll -Timestampserver "http://timestampurl"

签名后,您可以通过在状态属性中查询"有效"来检索签名状态。或不喜欢

$result = Set-AuthenticodeSignature -Certificate $my_cert -FilePath fqn_to_dll.dll -Timestampserver "http://timestampurl" | Select Status
if(-Not ($result -eq "Valid")){
    Write-Output "Error Signing file: Status: $($result.Status)"    
}