从命令行将 pfx 文件导入特定的证书存储

Posted

技术标签:

【中文标题】从命令行将 pfx 文件导入特定的证书存储【英文标题】:Import pfx file into particular certificate store from command line 【发布时间】:2011-07-07 11:11:45 【问题描述】:

使用 CertUtil 将证书从 pfx 文件导入用户的个人存储相对容易:

certutil –f –p [certificate_password] –importpfx C:\[certificate_path_and_name].pfx 

但这最终会出现在当前用户的个人商店中。我在 LocalMachine 上的 TrustedPeople 中需要它。

有什么方法可以从命令行执行此操作,通过在 certutil importpfx 上调用不同的参数,使用另一个 certutil 命令或不同的实用程序? Powershell是另一种可能,虽然我不太了解。

干杯, 马特

【问题讨论】:

【参考方案1】:

在这里为未来的读者锚定我的发现。

将证书导入本地计算机上的受信任根证书颁发机构:

CERTUTIL -addstore -enterprise -f -v root "somCertificat.cer"

在本地机器上将 pfx 导入个人

CERTUTIL -f -p somePassword -importpfx "somePfx.pfx"

将 pfx 导入本地计算机上的受信任人员 - Link 导入 pfx.exe

importpfx.exe -f "somePfx.pfx" -p "somePassword" -t MACHINE -s "TRUSTEDPEOPLE"

将证书导入本地计算机上的受信任人员

Certutil -addstore -f "TRUSTEDPEOPLE" "someCertificate.cer"

【讨论】:

令人沮丧的是,CERTUTIL 无法将 PFX 导入 TRUSTEDPEOPLE。 CertUtil 与远程 PSSession (PowerShell) 一起工作正常,但 importpfx 不能(仅供参考,importpfx 的源是home.fnal.gov/~jklemenc/src/importpfx.cpp)。我不确定 CERTUTIL 有什么不同,但它确实适用于远程 PS 会话,但我无法将证书放入 Trusted People。叹。这两天很郁闷。 我们最终编写了一组 powershell 函数来完成这项艰巨的工作。查看 CiPsLib.Certificates.psm1 -> Import-Certificate github.com/rasmus/CiPsLib/tree/master/tools 如何在不使用密码的情况下导入?有可能吗? @drgmak,如果证书受空密码保护,则使用 -p ""。如果它受密码保护,您需要知道密码。【参考方案2】:

对于寻找这个的其他人,我无法将certutil -importpfx 用于特定商店,并且我不想下载 jaspernygaard 的答案提供的 importpfx 工具以避免复制文件的要求到大量服务器。我最终在here 显示的 powershell 脚本中找到了答案。

代码使用System.Security.Cryptography.X509Certificates 导入证书,然后将其移动到所需的存储区:

function Import-PfxCertificate  

    param([String]$certPath,[String]$certRootStore = "localmachine",[String]$certStore = "My",$pfxPass = $null) 
    $pfx = new-object System.Security.Cryptography.X509Certificates.X509Certificate2 

    if ($pfxPass -eq $null) 
    
        $pfxPass = read-host "Password" -assecurestring
     

    $pfx.import($certPath,$pfxPass,"Exportable,PersistKeySet") 
    
    $store = new-object System.Security.Cryptography.X509Certificates.X509Store($certStore,$certRootStore) 
    $store.open("MaxAllowed") 
    $store.add($pfx) 
    $store.close() 

【讨论】:

你能帮我理解价值观及其含义吗? “最大允许”、“我的”、 @RaviKhambhati:我是我正在使用的证书商店的名称。有关证书存储位置的更多信息,请参阅 msdn.microsoft.com/en-us/library/windows/desktop/…。 MaxAllowed 是我用来打开的 OpenFlags 的值。老实说,我只是复制并粘贴了该部分,但您可以在此处了解有关它的可能值的更多信息:msdn.microsoft.com/en-us/library/… 非常感谢。当我们从 IIS 执行相同的操作时,这些值将是什么 您的代码确实是错误。您正在使用非 ASCII ,这会导致 powershell 中出现未定义的行为。它可能会随机失败,随机线,随机原因,在farking不可靠的powershell解析器中。 我已经调整了它@recolic。我不确定这是否适用于我的环境,或者我是否已修复它但忘记更新此答案。【参考方案3】:

检查这些链接: http://www.orcsweb.com/blog/james/powershell-ing-on-windows-server-how-to-import-certificates-using-powershell/

进口证书:http://poshcode.org/1937

你可以这样做:

dir -Path C:\Certs -Filter *.cer | Import-Certificate -CertFile $_ -StoreNames AuthRoot, Root -LocalMachine -Verbose

【讨论】:

【参考方案4】:

对于 Windows 10:

将证书导入当前用户的受信任根证书颁发机构:

certutil -f -user -p oracle -importpfx root "example.pfx"

将证书导入当前用户的可信人员:

certutil -f -user -p oracle -importpfx TrustedPeople "example.pfx"

将证书导入本地计算机上的受信任根证书颁发机构:

certutil -f -user -p oracle -enterprise -importpfx root "example.pfx"

将证书导入本地计算机上的受信任人员:

certutil -f -user -p oracle -enterprise -importpfx TrustedPeople "example.pfx"

【讨论】:

我真的很难将用户证书添加到新商店。最后一个例子对我有用。注意:如果您使用商店名称(例如“ABC”)而不是“TrustedPeople”,则会创建商店!无需使用 -addstore 参数来添加商店……这是我一直坚持的事情。【参考方案5】:

在 Windows 2012 R2 (Win 8.1) 及更高版本中,您还拥有“官方”Import-PfxCertificate cmdlet

以下是代码的一些基本部分(一个适应性示例):

Invoke-Command -ComputerName $Computer -ScriptBlock 
        param(
            [string] $CertFileName,
            [string] $CertRootStore,
            [string] $CertStore,
            [string] $X509Flags,
            $PfxPass)
        $CertPath = "$Env:SystemRoot\$CertFileName"
        $Pfx = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
        # Flags to send in are documented here: https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509keystorageflags%28v=vs.110%29.aspx
        $Pfx.Import($CertPath, $PfxPass, $X509Flags) #"Exportable,PersistKeySet")
        $Store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $CertStore, $CertRootStore
        $Store.Open("MaxAllowed")
        $Store.Add($Pfx)
        if ($?)
        
            "$Env:ComputerName: Successfully added certificate."
        
        else
        
            "$Env:ComputerName: Failed to add certificate! $($Error[0].ToString() -replace '[\r\n]+', ' ')"
        
        $Store.Close()
        Remove-Item -LiteralPath $CertPath
     -ArgumentList $TempCertFileName, $CertRootStore, $CertStore, $X509Flags, $Password

基于 mao47 的代码和一些研究,我写了一篇小文章和一个简单的 cmdlet,用于将 PFX 证书导入/推送到远程计算机。

Here's 我的文章包含更多详细信息和完整代码,也适用于 PSv2(Server 2008 R2 / Windows 7 上的默认设置),只要您启用了 SMB 和管理共享访问权限。

【讨论】:

虽然这在理论上可以回答问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。【参考方案6】:

这里是完整代码,导入pfx,添加iis网站,添加ssl绑定:

$SiteName = "MySite"
$HostName = "localhost"
$CertificatePassword = '1234'
$SiteFolder = Join-Path -Path 'C:\inetpub\wwwroot' -ChildPath $SiteName
$certPath = 'c:\cert.pfx'


Write-Host 'Import pfx certificate' $certPath
$certRootStore = “LocalMachine”
$certStore = "My"
$pfx = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$pfx.Import($certPath,$CertificatePassword,"Exportable,PersistKeySet") 
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store($certStore,$certRootStore) 
$store.Open('ReadWrite')
$store.Add($pfx) 
$store.Close() 
$certThumbprint = $pfx.Thumbprint


Write-Host 'Add website' $SiteName
New-WebSite -Name $SiteName -PhysicalPath $SiteFolder -Force
$IISSite = "IIS:\Sites\$SiteName"
Set-ItemProperty $IISSite -name  Bindings -value @protocol="https";bindingInformation="*:443:$HostName"
if($applicationPool)  Set-ItemProperty $IISSite -name  ApplicationPool -value $IISApplicationPool 


Write-Host 'Bind certificate with Thumbprint' $certThumbprint
$obj = get-webconfiguration "//sites/site[@name='$SiteName']"
$binding = $obj.bindings.Collection[0]
$method = $binding.Methods["AddSslCertificate"]
$methodInstance = $method.CreateInstance()
$methodInstance.Input.SetAttributeValue("certificateHash", $certThumbprint)
$methodInstance.Input.SetAttributeValue("certificateStoreName", $certStore)
$methodInstance.Execute()

【讨论】:

您可能希望导入标志为"Exportable,MachineKeySet,PersistKeySet",以便将私钥放入机器密钥,而不是放入当前用户的配置文件中。【参考方案7】:

在较新版本的 Windows 中,Certuil 具有 [CertificateStoreName],我们可以在其中提供商店名称。在早期版本的 Windows 中,这是不可能的。

安装 *.pfx 证书: certutil -f -p "" -enterprise -importpfx root ""

安装 *.cer 证书: certutil -addstore -enterprise -f -v root ""

下面的命令可以在 windows cmd 中执行。 C:>certutil -importpfx -? 用法: CertUtil [选项] -importPFX [CertificateStoreName] PFXFile [修饰符]

【讨论】:

以上是关于从命令行将 pfx 文件导入特定的证书存储的主要内容,如果未能解决你的问题,请参考以下文章

pfx格式文件如何打开?如题 谢谢了

pfx是啥文件

导入pfx时无法导入以下密钥文件错误

如何使用 c# 从 pfx 文件中检索证书?

F5运维之 将Windows中的证书导入F5

Flutter / Dart语言中的客户端证书身份验证