2012-09-17 12 views
5

Sto utilizzando il codice simile a quello trovato qui per creare un certificato auto-firmato per l'utilizzo in IIS: http://blogs.technet.com/b/vishalagarwal/archive/2009/08/22/generating-a-certificate-self-signed-using-powershell-and-certenroll-interfaces.aspxUtilizzando PowerShell per creare certificato autofirmato

funziona bene tranne che voglio dargli un nome descrittivo per facilitare l'individuazione quando si desidera assegnare il certificato a un sito creato dinamicamente.

Qualcuno sa come modificare quanto sopra per impostare il nome descrittivo (ho provato ciò che sembrava ovvio senza successo).

Hai un modo migliore per creare un certificato tramite PowerShell che non richiede all'utente informazioni?

Followup alla sceneggiatura che sto usando - in base all'URL sopra, ma trasformato in un cmdlet:

function Add-SelfSignedCertificate 
{ 
    [CmdletBinding()] 
    param 
    (
      [Parameter(Mandatory=$True, ValueFromPipelineByPropertyName=$True)] 
      [Alias('cn')] 
      [string]$CommonName 
    ) 

    $name = new-object -com "X509Enrollment.CX500DistinguishedName.1" 
    $name.Encode("CN=$CommonName", 0) 

    $key = new-object -com "X509Enrollment.CX509PrivateKey.1" 
    $key.ProviderName = "Microsoft RSA SChannel Cryptographic Provider" 
    $key.KeySpec = 1 
    $key.Length = 1024 
    $key.SecurityDescriptor = "D:PAI(A;;0xd01f01ff;;;SY)(A;;0xd01f01ff;;;BA)(A;;0x80120089;;;NS)" 
    $key.MachineContext = 1 
    $key.Create() 

    $serverauthoid = new-object -com "X509Enrollment.CObjectId.1" 
    $serverauthoid.InitializeFromValue("1.3.6.1.5.5.7.3.1") 
    $ekuoids = new-object -com "X509Enrollment.CObjectIds.1" 
    $ekuoids.add($serverauthoid) 
    $ekuext = new-object -com "X509Enrollment.CX509ExtensionEnhancedKeyUsage.1" 
    $ekuext.InitializeEncode($ekuoids) 

    $cert = new-object -com "X509Enrollment.CX509CertificateRequestCertificate.1" 
    $cert.InitializeFromPrivateKey(2, $key, "") 
    $cert.Subject = $name 
    $cert.Issuer = $cert.Subject 
    $cert.NotBefore = get-date 
    $cert.NotAfter = $cert.NotBefore.AddDays(90) 
    $cert.X509Extensions.Add($ekuext) 
    $cert.Encode() 

    $enrollment = new-object -com "X509Enrollment.CX509Enrollment.1" 
    $enrollment.InitializeFromRequest($cert) 
    $certdata = $enrollment.CreateRequest(0) 
    $enrollment.InstallResponse(2, $certdata, 0, "") 
} 

risposta

0

Scott Hanselman ha scritto un bel blog post on how to create a self-signed cert utilizzando il Makecert.exe strumento SDK. Quello strumento sembra essere un po 'più facile da usare rispetto al codice nel post di riferimento. Con makecert.exe puoi usare l'opzione -n ​​per specificare il nome di un soggetto. Ho usato quel nome soggetto per fare riferimento al certificato in altri strumenti come signtool.exe. Sebbene, ho trovato che i nomi dei soggetti non devono essere unici, quindi tendo ad usare il valore di Thumbprint che sembra essere unico. Signtool accetta anche un'identificazione personale (tramite il parametro/sha1) per identificare il certificato.

+0

Questo verrà incluso in uno script InstallShield, pertanto le finestre di dialogo visualizzate in makecert.exe sono problematiche. – roderickprince

+0

Selfssl.exe funzionerebbe? http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/ –

3

È possibile impostare il CertificateFriendlyName direttamente in te codice, è solo bisogno di sapere dove farlo:

$enrollment.InitializeFromRequest($cert) 
$enrollment.CertificateFriendlyName = 'whatever' 
$certdata = $enrollment.CreateRequest(0) 

$key ha un FriendlyName, ma non vedo che presentarsi ovunque quindi non lo faccio pensa che ti aiuti.

+0

Se qualcuno vorrebbe vedere un lavoro pienamente funzionante esempio c'è il codice PowerShell per farlo nello script su http://aka.ms/AD2AAD. –

11

Potrebbe non aiutare per il vostro uso specifico, ma c'è un nuovo cmdlet PowerShell installato in Windows 8.1 e Server 2012 che è abbastanza veloce e facile da usare:

New-SelfSignedCertificate [-CertStoreLocation <String> ] [-CloneCert <Certificate> ] [-DnsName <String> ] [-Confirm] [-WhatIf] [ <CommonParameters>] 

Maggiori dettagli possono essere trovati qui: http://technet.microsoft.com/en-us/library/hh848633.aspx

Nel mio utilizzo, il nome descrittivo del certificato è sempre stato impostato come primo DnsName specificato in CmdLet.

Esempio che pone il certificato nell'archivio personale del vostro computer locale:

New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName www.example.com 

Nota: Powershell deve essere avviato con privilegi di amministratore per questo al lavoro.

+0

non dovrebbe essere 'cert: \ LocalMachine \ My'? Ho controllato i miei computer Windows 10 e 2012 Server ... Nessuno ha 'cert: \ LocalComputer'. – Lucas

Problemi correlati