Импортируйте файл pfx в определенное хранилище сертификатов из командной строки - PullRequest
30 голосов
/ 02 марта 2011

Относительно легко импортировать сертификат в личный магазин пользователя из pfx-файла с помощью CertUtil:

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

Но это заканчивается в Личном хранилище текущего пользователя.Мне это нужно в TrustedPeople на LocalMachine.

Есть ли способ сделать это из командной строки, вызвав разные аргументы в certutil importpfx, используя другую команду certutil или другую утилиту?Powershell - еще одна возможность, хотя я мало что знаю об этом.

Приветствия, Мэтт

Ответы [ 7 ]

55 голосов
/ 31 августа 2011

Закрепление моих находок здесь для будущих читателей.

Импорт сертификата доверенным корневым центрам сертификации на локальном компьютере:

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

Импорт pfx в Personal на локальном компьютере

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"
8 голосов
/ 21 января 2014

Для тех, кто ищет это, я не смог использовать certutil -importpfx в определенном магазине и не хотел загружать инструмент importpfx, предоставленный ответом jaspernygaard, чтобы избежать необходимости копирования файлана большое количество серверов.В итоге я нашел свой ответ в скрипте 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() 
}
6 голосов
/ 02 марта 2011

Проверьте эти ссылки: 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
3 голосов
/ 22 июня 2017

Для 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"
2 голосов
/ 31 декабря 2015

В 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 (по умолчанию на Server 2008 R2 / Windows 7), при условии, что у вас включен SMB и административный общий доступ.

1 голос
/ 13 января 2016

Вот полный код, импортируйте 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()
0 голосов
/ 25 января 2019

В более новой версии 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 [Модификаторы]

...