使用CertUtil从pfx文件导入证书到用户的个人存储中相对容易:
certutil –f –p [certificate_password] –importpfx C:\[certificate_path_and_name].pfx
但最终会出现在当前用户的个人存储中。我需要在LocalMachine上的TrustedPeople中使用它。
有没有办法可以通过命令行执行此操作,方法是使用另一个certutil命令或其他实用程序调用certutil importpfx上的不同参数? Powershell是另一种可能性,虽然我对此并不了解。
干杯, 马特
答案 0 :(得分:55)
将我的发现寄托在未来的读者身上。
将证书导入本地计算机上的受信任的根证书颁发机构:
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"
答案 1 :(得分:8)
对于其他寻找此问题的人,我无法将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()
}
答案 2 :(得分:6)
您可以执行以下操作:
dir -Path C:\Certs -Filter *.cer | Import-Certificate -CertFile $_ -StoreNames AuthRoot, Root -LocalMachine -Verbose
答案 3 :(得分:2)
使用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和管理共享访问权限。
答案 4 :(得分:2)
对于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"
答案 5 :(得分:1)
这是完整的代码,导入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()
答案 6 :(得分:0)
在较新版本的Windows中,Certuil具有[CertificateStoreName],我们可以在其中提供商店名称。在早期版本的Windows中,这是不可能的。
安装* .pfx证书: certutil -f -p“”-企业-importpfx根“”
安装* .cer证书: certutil -addstore -enterprise -f -v root“”
有关以下更多详细信息,可以在Windows cmd中执行命令。 C:> certutil -importpfx-? 用法: CertUtil [选项] -importPFX [CertificateStoreName] PFXFile [修饰符]