¿Cómo crear un certificado autofirmado en Windows con PowerShell?

La mayoría de los administradores de Windows, que están familiarizados con PKI, conocen la MakeCert.exe herramienta, que permite crear un certificado autofirmado. Esta herramienta es parte de Microsoft .NET Framework SDK y Microsoft Windows SDK. En las versiones modernas de Windows (Windows 10 / 8.1 y Windows Server 2019/2016 / 2012R2) puede crear un certificado autofirmado mediante el cmdlet de PowerShell integrado New-SelfSignedCertificate sin utilizar herramientas adicionales.

Uso del cmdlet de PowerShell New-SelfSignedCertificate para crear un certificado autofirmado

Para crear un certificado autofirmado con PowerShell, puede usar el Nuevo certificado autofirmado cmdlet, que es parte de PoSh PKI (Infraestructura de clave pública):

Para enumerar todos los cmdlets disponibles en el módulo PKI, ejecute el comando.

Get-Command -Module PKI

módulo pki de powershell - administrar certificados en windows

Se recomienda utilizar certificados autofirmados con fines de prueba o para proporcionar certificados para servicios de Intranet internos (IIS, Exchange, Proxy de aplicación web, LDAPS, ADRMS, DirectAccess, etc.) si no puede implementar la infraestructura PKI / CA o comprar una certificado de un proveedor externo.

Propina. No olvide que puede obtener fácilmente un certificado SSL gratuito de Let’s Encrypt. A continuación, se muestra un ejemplo de cómo emitir el certificado SSL Let’s Encrypt y vincularlo al sitio de IIS en Windows Server.

Para crear un certificado, debe especificar los valores de –DnsName (nombre de un servidor, el nombre puede ser arbitrario y diferente del nombre del host local) y -CertStoreLocation (un almacén de certificados local en el que se colocará el certificado generado). Puede usar el cmdlet para crear un certificado autofirmado en Windows 10 (en este ejemplo), Windows 8.1 y Windows Server 2019/2016/2012 R2 / 2012.

Para crear un nuevo certificado SSL (del tipo SSLServerAuthentication predeterminado) para el nombre DNS test.contoso.com (use un nombre FQDN) y colocarlo en la lista de certificados personales en una computadora, ejecute el siguiente comando:

New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:LocalMachineMy

powershell: cmdlet New-SelfSignedCertificate en Windows 10, Windows Server 2016

Directory: Microsoft.PowerShell.SecurityCertificate::LocalMachineMy
Thumbprint                               Subject
----------                               -------
2175A76B10F843676951965F52A718F635FFA043   CN=test.contoso.com

Si ejecuta este comando en una sesión de PowerShell no elevada (sin permisos de administrador local), aparece un error:

New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)

Si ha especificado un proveedor criptográfico (CSP) no estándar, por ejemplo, utilizando el -KeyAlgorithm "ECDSA_secP256r1" -Provider "Microsoft Smart Card Key Storage Provider" , asegúrese de que esté instalado en su computadora (el valor predeterminado es Microsoft Enhanced Cryptographic Provider CSP). De lo contrario, aparecerá un error:

New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).

Este comando crea un nuevo certificado y lo importa en el almacén de certificados personales de la computadora. Abre el certlm.msc Complemento MMC, asegúrese de que aparezca un nuevo certificado en el Personal sección del almacén de certificados.

De forma predeterminada, se genera un certificado autofirmado con la siguiente configuración:

  • Algoritmo criptográfico: RSA;
  • Longitud de la clave: 2048 bits;
  • Uso aceptable de claves: Autenticación del cliente y Autenticación del servidor;
  • El certificado se puede utilizar para: Firma digital, Cifrado de claves;
  • Período de validez del certificado: 1 año.

Como puede ver, las propiedades del certificado indican que este certificado se puede usar para la autenticación del cliente, pero también es válido para la autenticación del servidor.

certlm.msc almacenamiento de certificados personales

Con el cmdlet Get-ChildItem, puede mostrar todos los parámetros del certificado creado por su huella digital:

Get-ChildItem -Path "Cert:LocalMachineMy" | Where-Object Thumbprint -eq 2175A76B10F843676951965F52A718F635FFA043 | Select-Object *

enumerar las propiedades del certificado autofirmado con powershell

PSPath                   : Microsoft.PowerShell.SecurityCertificate::LocalMachineMy2175A76B10F843676951965F52A718F635FFA043
PSParentPath             : Microsoft.PowerShell.SecurityCertificate::LocalMachineMy
PSChildName              : 2175A76B10F843676951965F52A718F635FFA043
PSDrive                  : Cert
PSProvider               : Microsoft.PowerShell.SecurityCertificate
PSIsContainer            : False
EnhancedKeyUsageList     : {Client Authentication (1.3.6.1.5.5.7.3.2), Server Authentication (1.3.6.1.5.5.7.3.1)}
DnsNameList              : {test.contoso.com}
SendAsTrustedIssuer      : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId                 :
Archived                 : False
Extensions               : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid,
System.Security.Cryptography.Oid, System.Security.Cryptography.Oid}
FriendlyName             :
IssuerName               : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter                 : 05/11/2021 06:19:42
NotBefore                : 05/11/2020 05:59:42
HasPrivateKey            : True
PrivateKey               :
PublicKey                : System.Security.Cryptography.X509Certificates.PublicKey
RawData                  : {48, 130, 3, 45...}
SerialNumber             : 6797F5E3F870478D4D3798BEB291DBF3
SubjectName              : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm       : System.Security.Cryptography.Oid
Thumbprint               : 2175A76B10F843676951965F52A718F635FFA043
Version                  : 3
Handle                   : 2834444631568
Issuer                   : CN=test.contoso.com
Subject                  : CN=test.contoso.com

Nota. Dicho certificado autofirmado caducará en 1 año a partir de la fecha de su creación. Puede establecer un período de validez de certificado diferente utilizando el -No después de opción. Por ejemplo, puede emitir un certificado SSL / TLS con un período de validez de tres años con los siguientes comandos:

$todaydt = Get-Date
$3years = $todaydt.AddYears(3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $3years -CertStoreLocation cert:LocalMachineMy

Puede crear una cadena de certificados. Primero, se crea un certificado raíz (CA) y, en base a él, se genera un certificado de servidor SSL:

$rootCert = New-SelfSignedCertificate -Subject 'CN=TestRootCA,O=TestRootCA,OU=TestRootCA' -KeyExportPolicy Exportable  -KeyUsage CertSign,CRLSign,DigitalSignature -KeyLength 2048 -KeyUsageProperty All -KeyAlgorithm 'RSA'  -HashAlgorithm 'SHA256'  -Provider 'Microsoft Enhanced RSA and AES Cryptographic Provider'
New-SelfSignedCertificate -CertStoreLocation cert:LocalMachineMy -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignature

Para exportar el certificado generado con una clave privada a un archivo PFX protegido con contraseña, debe especificar su huella digital. Se puede copiar de los resultados del comando New-SelfSignedCertificate. También debe especificar la contraseña de seguridad del certificado y convertirla al formato SecureString:

$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force –AsPlainText
Export-PfxCertificate -Cert cert:LocalMachineMy2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:test.pfx -Password $CertPassword

Exportar-PfxCertificate

La clave pública del certificado se puede exportar de la siguiente manera:

Export-Certificate -Cert Cert:LocalMachineMy2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:tstcert.cer

Asegúrese de que el archivo de certificado * .cer (PFX) aparezca en el directorio especificado. Si hace clic con el botón derecho del ratón y selecciona «Instalar certificado«Elemento de menú, puede utilizar el Asistente de importación de certificados para agregar el certificado a los certificados raíz de confianza en su computadora.

instalar certificado con el explorador de archivos en Windows 10

Seleccione la ubicación de Cert Store -> Máquina local, Coloque todos los certificados en la siguiente tienda -> Autoridades de certificación raíz de confianza.

instalar el certificado en las autoridades de certificación raíz de confianza

Puede crear un certificado e importarlo inmediatamente al almacén de certificados raíz de confianza de la computadora usando los comandos:
$SelfSignCert=New-SelfSignedCertificate …..
$certFile = Export-Certificate -Cert $SelfSignCert -FilePath C:psexport-certname.cer
Import-Certificate -CertStoreLocation Cert:LocalMachineAuthRoot -FilePath $certFile.FullName

Esta clave pública o el archivo de certificado en sí se puede implementar en todos los equipos y servidores del dominio de Active Directory mediante GPO (¿Cómo implementar certificados en equipos de dominio mediante GPO?).

Cree un certificado autofirmado con nombres alternativos del sujeto

Una de las características útiles del cmdlet New-SelfSignedCertificate es la capacidad de crear un certificado con varios nombres diferentes, Nombres alternativos del sujeto (SAN).

Nota. los Makecert.exe La herramienta, a diferencia del cmdlet New-SelfSignedCertificate, no puede generar certificados SAN y Wildcard.

Si desea crear un certificado con varios nombres, el primer nombre del parámetro DnsName se utilizará como CN (Nombre común) del certificado. Por ejemplo, creemos un certificado SAN autofirmado con los siguientes nombres:

  • Nombre del sujeto (CN): adfs1.contoso.com
  • Nombre alternativo del sujeto (DNS): web_gw.contoso.com
  • Nombre alternativo del sujeto (DNS): enterprise_reg.contoso.com

El comando para crear un certificado se verá así:

New-SelfSignedCertificate -DnsName adfs1.contoso.com,web_gw.contoso.com,enterprise_reg.contoso.com -CertStoreLocation cert:LocalMachineMy

certificado con varios nombres alternativos de sujeto

Además, también puede generar un comodín certificado para todo el espacio de nombres de dominio. Para hacerlo, especifique * .contoso.com como nombre de servidor.

New-SelfSignedCertificate -certstorelocation cert:localmachinemy -dnsname *.contoso.com

Genere un certificado autofirmado para la firma de código en Windows

En PoweShell 3.0, el cmdlet New-SelfSifgnedCertificate solo genera certificados SSL que no se pueden usar para firmar el controlador, la aplicación o el código de secuencia de comandos (a diferencia de los certificados generados por la utilidad MakeCert).

En PowerShell versión 5.0 y posteriores, ahora se puede usar una nueva versión del cmdlet New-SelfSifgnedCertificate para emitir Firma de código Certificados.

Para crear un certificado de firma de código de aplicación autofirmado, ejecute el comando:

$cert = New-SelfSignedCertificate -Subject "My Code Signing Certificate” -Type CodeSigningCert -CertStoreLocation cert:LocalMachineMy

Ahora puede firmar su secuencia de comandos de PowerShell con un certificado autofirmado:

Set-AuthenticodeSignature -FilePath C:PSmy_posh_script.ps1 -Certificate $cert

Si está recibiendo un Error desconocido advertencia al ejecutar el comando, esto significa que el certificado no es de confianza, porque se encuentra en el almacén de certificados personales del usuario.

firma de script de PowerShell con certificado autofirmado - error desconocido

Debe moverlo al almacén de certificados raíz de confianza (no olvide escanear periódicamente el almacén raíz de certificados de Windows en busca de certificados sospechosos y que no sean de confianza y actualizar las listas de certificados raíz de confianza).

Move-Item -Path $cert.PSPath -Destination "Cert:CurrentUserRoot"

Después de eso, puede firmar su secuencia de comandos de PowerShell con este certificado autofirmado.

Uso del certificado SSL autofirmado SHA-256 en IIS en Windows Server IIS

Tenga en cuenta que al crear un certificado autofirmado para IIS a través de la consola de Internet Information Manager (Crear certificado autofirmado elemento del menú de acción), se crea un certificado SSL utilizando el algoritmo de cifrado SHA-1. Muchos navegadores consideran que dichos certificados no son de confianza y no se pueden utilizar para establecer una conexión segura (o es posible que vea otros errores de SSL). El cmdlet New-SelfSignedCertificate le permite crear un tipo de certificado más popular mediante el algoritmo de cifrado SHA-256.

es crear un certificado ssl autofirmado en el servidor de Windows

Puede vincular un certificado SHA-256 autofirmado generado con PowerShell a un sitio IIS en Windows Server. Si crea un certificado SSL con PowerShell y lo coloca en el almacén de certificados de la computadora, automáticamente estará disponible para los sitios de IIS.

vinculación del certificado sha256 autofirmado al sitio iis en el servidor de Windows

Inicie la consola del Administrador de IIS, seleccione su sitio y luego en el Enlace del sitio opciones, seleccione el certificado que creó y guarde los cambios.

Artículos Interesantes