Импортировать файл pfx в конкретный хранилище сертификатов из командной строки
Сравнительно легко импортировать сертификат в личное хранилище пользователя из файла pfx с помощью CertUtil:
certutil –f –p [certificate_password] –importpfx C:\[certificate_path_and_name].pfx
Но это заканчивается в Личном хранилище текущего пользователя. Мне нужно это в TrustedPeople в LocalMachine.
Есть ли способ сделать это из командной строки, вызывая разные аргументы в certutil importpfx, используя другую команду certutil или другую полезность? Powershell - еще одна возможность, хотя я мало что знаю об этом.
Cheers,
Matt
Ответы
Ответ 1
Закрепление моих результатов здесь для будущих читателей.
Импортировать сертификат в доверенные корневые центры сертификации на локальном компьютере:
CERTUTIL -addstore -enterprise -f -v root "somCertificat.cer"
Импорт pfx в личный на локальном компьютере
CERTUTIL -f -p somePassword -importpfx "somePfx.pfx"
Импортировать pfx доверенным пользователям на локальном компьютере - Ссылка на importpfx.exe
importpfx.exe -f "somePfx.pfx" -p "somePassword" -t MACHINE -s "TRUSTEDPEOPLE"
Импорт сертификатов для доверенных лиц на локальном компьютере
Certutil -addstore -f "TRUSTEDPEOPLE" "someCertificate.cer"
Ответ 2
Другим, кто ищет это, я не смог использовать certutil -importpfx
в определенном хранилище, и я не хотел загружать инструмент importpfx, предоставленный ответом jaspernygaard, чтобы избежать необходимости копирования файла на большое количество серверов. В итоге я нашел свой ответ в powershell script, показанный здесь.
В коде используется 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()
}
Ответ 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 2012 R2 (Win 8.1) и выше у вас также есть "официальный" Import-PfxCertificate командлет
Вот некоторые существенные части кода (адаптируемый пример):
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 и некоторых исследований я написал небольшую статью и простой командлет для импорта/нажатия сертификатов PFX на удаленные компьютеры.
Вот моя статья с более подробной информацией и полным кодом, который также работает с PSv2 (по умолчанию на сервере 2008 R2/Windows 7), пока у вас есть доступ к SMB и доступ к административным ресурсам.
Ответ 5
Для окон 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"
Ответ 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()
Ответ 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 [Модификаторы]