我必须使用来自远程计算机的证书对远程脚本进行签名。我有一个.pfx文件。
我想通过以编程方式为Get-PfxCertificate提供密码来自动化脚本。
所以问题是:
是否有可能以某种方式以编程方式提供所需的密码
GET-PfxCertificate?
答案 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)"
}