2012-09-17 87 views
5

estoy usando un código similar al que se encuentra aquí para crear un certificado autofirmado para su uso en IIS: http://blogs.technet.com/b/vishalagarwal/archive/2009/08/22/generating-a-certificate-self-signed-using-powershell-and-certenroll-interfaces.aspxEl uso de PowerShell para crear un certificado autofirmado

funciona bien, excepto que quiero darle un nombre descriptivo para facilitar la localización cuando quiero asignar el certificado a un sitio creado dinámicamente.

Cualquier persona sabe cómo cambiar lo anterior para establecer el nombre descriptivo (he intentado lo que parecía obvio en vano).

¿Tiene una mejor manera de crear un certificado a través de PowerShell que no solicite información al usuario?

Seguimiento de la secuencia de comandos que estoy usando - Basado en la URL anterior, pero se convirtió en 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, "") 
} 

Respuesta

0

de Scott Hanselman escribió un buen blog post on how to create a self-signed cert utilizando la herramienta de makecert.exe SDK. Esa herramienta parece ser un poco más fácil de usar que el código en la publicación a la que hace referencia. Con makecert.exe puede usar la opción -n para especificar un nombre de sujeto. He usado ese nombre de sujeto para referirme al certificado en otras herramientas como signtool.exe. Aunque, he descubierto que los nombres de los sujetos no tienen que ser únicos, así que tiendo a usar el valor de Thumbprint que parece ser único. Signtool también aceptará una huella digital (a través del parámetro/sha1) para identificar el certificado.

+0

Esto se va a incluir en una secuencia de comandos InstallShield por lo tanto, los cuadros de diálogo emergentes que muestra makecert.exe es problemático. – roderickprince

+0

¿Funcionaría selfssl.exe? http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/ –

3

Puede configurar el CertificateFriendlyName directamente en su código, sólo tiene que saber dónde hacerlo:

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

$key tiene un FriendlyName pero no veo que aparecer en cualquier lugar, así que no hago creo que te ayuda

+0

Si a alguien le gustaría ver un funcionamiento completo Por ejemplo, hay un código de PowerShell para hacer esto en el script en http://aka.ms/AD2AAD. –

11

Puede que no ayudará para su uso específico, pero hay una nueva PowerShell cmdlet instalado en Windows 8.1 y Server 2012 que es bastante rápido y fácil de usar:

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

Más detalles se pueden encontrar aquí: http://technet.microsoft.com/en-us/library/hh848633.aspx

En mi uso, el nombre descriptivo del certificado siempre se ha establecido como el primer nombreDNS especificado en CmdLet.

ejemplo que pone el certificado en el almacén personal del equipo local:

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

Nota: Powershell se tiene que iniciar con derechos de administrador para que esto funcione.

+0

¿no debería ser 'cert: \ LocalMachine \ My'? Comprobé en las máquinas de servidor de Windows 10 y 2012 ... Ninguna tiene 'cert: \ LocalComputer'. – Lucas

Cuestiones relacionadas