PowerShell 使用密码 PFX 文件获取证书指纹

Posted

技术标签:

【中文标题】PowerShell 使用密码 PFX 文件获取证书指纹【英文标题】:PowerShell Get Certificate Thumbprint with Password PFX File 【发布时间】:2015-01-08 17:42:03 【问题描述】:

我正在尝试使用此代码获取受密码保护的 pfx 文件的指纹:

function Get-CertificateThumbprint 
    # 
    # This will return a certificate thumbprint, null if the file isn't found or throw an exception.
    #

    param (
        [parameter(Mandatory = $true)][string] $CertificatePath,
        [parameter(Mandatory = $false)][string] $CertificatePassword
    )

    try 
        if (!(Test-Path $CertificatePath)) 
            return $null;
        

        if ($CertificatePassword) 
            $sSecStrPassword = ConvertTo-SecureString -String $CertificatePassword -Force –AsPlainText
        

        $certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
        $certificateObject.Import($CertificatePath, $sSecStrPassword);

        return $certificateObject.Thumbprint
     catch [Exception] 
        # 
        # Catch accounts already added.
        throw $_;
    

当我运行它时,我得到了这个错误:

Cannot find an overload for "Import" and the argument count: "2".
At C:\temp\test.ps1:36 char:9
+         $certificateObject.Import($CertificatePath, $sSecStrPassword);
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

有人可以帮我解决这个问题吗?

谢谢大家。 :-)

【问题讨论】:

【参考方案1】:

PowerShell 错误消息是正确的。没有采用两个参数的重载。根据您使用的参数,我认为您想要 overload that requires a third parameter - 一个枚举 - X509KeyStorageFlags 例如

$certificateObject.Import($CertificatePath, $sSecStrPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet)

【讨论】:

【参考方案2】:

根据this SuperUser response,在PS 3.0中有Get-PfxCertificate command可以做到这一点:

 Get-PfxCertificate -FilePath Certificate.pfx 

【讨论】:

来自 Microsoft 的示例:PS C:\> Get-PfxCertificate -FilePath "C:\windows\system32\Test.pfx" Get-PfxCertificate 没有密码参数。如果您需要在非交互模式下导入证书,请参阅 kyorilys 的答案。【参考方案3】:

你可以这样做

$certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$certificateObject.Import($CertificatePath, $sSecStrPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet)
return $certificateObject.Thumbprint

记得设置这两个变量:$CertificatePath 和 $sSecStrPassword

【讨论】:

在新版本上,您应该使用 $certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertificatePath, $sSecStrPassword)【参考方案4】:

仅供参考,看起来 Get-PfxCertificate 将添加在 powershell 6.0 中传递密码的功能。

https://github.com/PowerShell/PowerShell-Docs/issues/2150

【讨论】:

【参考方案5】:

感谢这个答案:Is there a command line utility to extract the certificate thumbprint? 我能够制定出以下效果很好的单线:

    $thumbprint = (certutil -split -dump .\cert.pfx | findstr /c:"Cert Hash(sha1)").Substring(17)[-1]

如果 PFX 受密码保护,

    $thumbprint = (certutil -split -p the_secret_password_to_my_pfx -dump .\cert.pfx | findstr /c:"Cert Hash(sha1)").Substring(17)[-1]

从技术上讲,它不是纯 powershell,因为它调用 certutil.exe,但它应该在每个 Windows 系统上,所以它可以工作。

【讨论】:

【参考方案6】:

这是我用来读取文件中证书的指纹而不在 Windows PowerShell 5.1 上导入文件的方法:

$Thumbprint = (Get-PfxData -Password $MyPFXCertificatePwdSecureString -FilePath $CertificateFilePath).EndEntityCertificates.Thumbprint

有关 Get-PfxData 的更多信息可在此处找到: https://docs.microsoft.com/en-us/powershell/module/pkiclient/get-pfxdata

【讨论】:

【参考方案7】:

如果您在 powershell 中遇到路径错误,请使用以下脚本:

$FilePath = "c:\a\"
$FileName = "mycert"
$FileType = ".pfx"
$certificateObject = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$certificateObject.Import($FilePath+$FileName+$FileType, $sSecStrPassword, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet)
return $certificateObject.Thumbprint

【讨论】:

以上是关于PowerShell 使用密码 PFX 文件获取证书指纹的主要内容,如果未能解决你的问题,请参考以下文章

pfx文件是不是包含根证书

将证书转换为 pfx 或 p12 文件格式

有人做过wp上如何从pfx文件中获取私钥吗

nginx配置https

如何将 .crt 证书文件转换为 .pfx

如何安全地存储 .pfx 密码以在 MSBuild 中使用?