web-dev-qa-db-fra.com

Importer un fichier pfx dans un magasin de certificats particulier à partir de la ligne de commande

Il est relativement facile d'importer un certificat dans le magasin personnel de l'utilisateur à partir d'un fichier pfx à l'aide de CertUtil:

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

Mais cela se termine dans le magasin personnel de l'utilisateur actuel. J'en ai besoin dans TrustedPeople sur LocalMachine.

Est-il possible de le faire à partir de la ligne de commande, en appelant des arguments différents sur certutil importpfx, en utilisant une autre commande certutil ou un autre utilitaire? Powershell est une autre possibilité, bien que je ne sache pas grand chose à ce sujet.

A bientôt, Matt

28
Matt Thrower

Ancrer mes découvertes ici pour les futurs lecteurs.

Importer le certificat vers les autorités de certification racines de confiance sur l'ordinateur local:

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

Importer pfx dans Personnel sur une machine locale

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

Importation de pfx vers des personnes de confiance sur la machine locale - Lien vers importpfx.exe

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

Importer un certificat sur Trusted People sur une machine locale

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

Pour ceux qui recherchaient cela, je ne pouvais pas utiliser certutil -importpfx dans un magasin spécifique, et je ne voulais pas télécharger l'outil importpfx fourni par la réponse de jaspernygaard afin d'éviter d'avoir à copier le fichier sur un grand les serveurs. J'ai fini par trouver ma réponse dans un script PowerShell montré ici .

Le code utilise System.Security.Cryptography.X509Certificates pour importer le certificat, puis le déplace dans le magasin souhaité:

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() 
}
8
mao47

Avec Windows 2012 R2 (Win 8.1) et versions ultérieures, vous disposez également de la cmdlet "officielle" Import-PfxCertificate

Voici quelques parties essentielles du code (un exemple adaptable):

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

Sur la base du code de mao47 et de quelques recherches, j'ai rédigé un petit article et une simple applet de commande permettant d'importer/d'envoyer des certificats PFX sur des ordinateurs distants.

Voici mon article avec plus de détails et un code complet qui fonctionne également avec PSv2 (valeur par défaut sur Server 2008 R2/Windows 7), tant que vous avez SMB activé et un partage administratif.

2
Joakim

Pour les fenêtres 10:

importer le certificat vers les autorités de certification racines de confiance pour l'utilisateur actuel:

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

importer le certificat vers des personnes de confiance pour l'utilisateur actuel:

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

importer le certificat vers les autorités de certification racines de confiance sur l'ordinateur local:

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

certificat d'importation vers des personnes de confiance sur l'ordinateur local:

certutil -f -user -p Oracle -enterprise -importpfx TrustedPeople "example.pfx"
2
BurningFish

Voici le code complet, importer pfx, ajouter un site web iis, ajouter une liaison 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()
1
Aurel Havetta

Dans les versions plus récentes de Windows, le Certuil a [CertificateStoreName] où nous pouvons donner le nom du magasin. Dans les versions antérieures de Windows, cela n’était pas possible.

Installation du certificat * .pfx: Certutil -f -p "" -enterprise -importpfx root ""

Installation du certificat * .cer: Certutil -addstore -enterprise -f -v root ""

Pour plus de détails, la commande peut être exécutée dans Windows cmd . C:> certutil -importpfx -? Utilisation: CertUtil [Options] -importPFX [CertificateStoreName] PFXFile [Modificateurs]

0
santoshkhembram