Cómo crear un certificado autofirmado en Windows
La mayoría de los administradores de Windows, que están familiarizados con PKI, conocen la
MakeCert.exeherramienta, que permite crear certificados autofirmados. Esta herramienta es parte de Microsoft .NET Framework SDK y Microsoft Windows SDK. En las versiones modernas de Windows (Windows 11/10/8.1 y Windows Server 2022/2019/2016/2012R2), puede crear un certificado autofirmado con el cmdlet integrado de PowerShell
New-SelfSignedCertificatesin utilizar herramientas adicionales.
New-SelfSignedCertificate: creación de un certificado autofirmado con PowerShell
Para crear un certificado autofirmado con PowerShell, puede usar el cmdlet integrado New-SelfSignedCertificate , que forma parte del módulo PKI (infraestructura de clave pública) de PowerShell:
Para enumerar todos los cmdlets disponibles en el módulo PKI, ejecute el comando:
Get-Command -Module PKI
Se recomienda utilizar certificados autofirmados para tareas de prueba/desarrollo o 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 un certificado de confianza de un proveedor externo.
Consejo. No olvide que puede obtener fácilmente un certificado SSL gratuito de Let's Encrypt. Este es un ejemplo de cómo emitir el certificado SSL de 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 e incluso diferente del nombre de host actual) y -CertStoreLocation (un almacén de certificados local en el que se colocará el certificado generado).
Para crear un nuevo certificado SSL (con el tipo SSLServerAuthentication predeterminado) para el nombre DNS test.contoso.com (use un nombre FQDN) y colóquelo en los certificados personales en una computadora, ejecute el siguiente comando:
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\MyEl comando devolverá la huella digital, el asunto y la lista de uso de clave mejorada del nuevo certificado. De forma predeterminada, dicho certificado se puede utilizar para la autenticación del cliente (1.3.6.1.5.5.7.3.2) o la autenticación del servidor (1.3.6.1.5.5.7.3.1).
Si ejecuta este comando en un indicador de PowerShell no elevado (sin permisos de administrador local), aparecerá un error:
New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)Si ha especificado un proveedor criptográfico no estándar (CSP) (por ejemplo, utilizando el
-KeyAlgorithm "ECDSA_secP256r1" -Provider "Microsoft Smart Card Key Storage Provider"parámetros), asegúrese de que esté instalado en su computadora (el valor predeterminado es Microsoft Enhanced Cryptographic Provider). De lo contrario, aparecerá un error:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).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 de cliente y Autenticación de servidor;
El certificado se puede utilizar para: Firma digital, Cifrado de clave;
Período de validez del certificado: 1 año;
Proveedor de cifrado: Proveedor de almacenamiento de claves de software de Microsoft.
Este comando crea un nuevo certificado y lo importa al almacén de certificados personales de la computadora. Abra el complemento certlm.msc MMC y asegúrese de que aparezca un nuevo certificado en la sección Personal del almacén de certificados de la computadora.
Con el cmdlet Get-ChildItem, puede mostrar todos los parámetros del certificado creado por su huella digital:
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 2175A76B10F843676951965F52A718F635FFA043 | Select-Object *
PSPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My\2175A76B10F843676951965F52A718F635FFA043
PSParentPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My
PSChildName : 2175A76B10F843676951965F52A718F635FFA043
PSDrive : Cert
PSProvider : Microsoft.PowerShell.Security\Certificate
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 : 12/4/2023 5:35:15 PM
NotBefore : 12/4/2022 5:15:15 PM
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. Este certificado autofirmado caducará 1 año después de su creación. Puede establecer un período de validez de certificado diferente mediante la opción -NotAfter. 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:\LocalMachine\MyPuede crear una cadena de certificados. Primero, se crea un certificado raíz (CA). Luego, en base a ello, 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:\LocalMachine\My -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignaturePara cambiar la longitud de la clave del certificado y el algoritmo de cifrado, debe utilizar el
-KeyAlgorithm,
-KeyLength, y
-HashAlgorithmopciones Por ejemplo:
New-SelfSignedCertificate -KeyAlgorithm RSA -KeyLength 2048 -HashAlgorithm "SHA256" …El Microsoft Platform Crypto Provider le permite usar el chip del Módulo de plataforma segura (TPM 2.0) del dispositivo para proteger la clave.
New-SelfSignedCertificate -Type Custom -Provider "Microsoft Platform Crypto Provider" ...Puede generar un certificado de cifrado de documentos para proteger su documento y correo electrónico. Utilizar el
DocumentEncryptionCertescriba al crear un certificado:
$Params = @{
"DnsName" = "myhostname"
"CertStoreLocation" = "Cert:\\CurrentUser\\My"
"KeyUsage" = "KeyEncipherment","DataEncipherment","KeyAgreement"
"Type" = "DocumentEncryptionCert"
}
$doccert=New-SelfSignedCertificate @ParamsCompruebe el valor de EnhancedKeyUsageList del certificado:
$doccert|select EnhancedKeyUsageList{Document Encryption (1.3.6.1.4.1.311.80.1)}Cree un certificado con el nombre alternativo del sujeto (SAN) mediante PowerShell
El cmdlet New-SelfSignedCertificate le permite crear un certificado con varios Nombres alternativos de sujeto (SAN) diferentes.
Nota. El
Makecert.exeLa herramienta, a diferencia del cmdlet New-SelfSignedCertificate, no puede crear 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.comNombre alternativo del sujeto (DNS):
web_gw.contoso.comNombre alternativo del sujeto (DNS):
enterprise_reg.contoso.com
Puede usar el siguiente comando para generar un certificado con diferentes nombres comunes (o incluso para múltiples dominios):
New-SelfSignedCertificate -DnsName adfs1.contoso.com,web_gw.contoso.com,enterprise_reg.contoso.com -CertStoreLocation cert:\LocalMachine\MyAdemás, puede generar un certificado comodín para todo el espacio de nombres del dominio especificando *.contoso.com como el nombre del servidor.
New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname *.contoso.comPuede generar un certificado autofirmado no solo para un nombre de host DNS, sino también para una dirección IP. Para hacer esto, necesitas usar
-TextExtensionen lugar del parámetro -DnsName. Por ejemplo:
New-SelfSignedCertificate -TextExtension @("2.5.29.17={text}IPAddress=10.1.2.3&DNS=TESTServer1&DNS=TESTServer1.local")Como puede ver, el campo Nombre alternativo del sujeto ahora contiene la dirección IP del host y sus nombres DNS.
¿Cómo exportar un certificado autofirmado en Windows?
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 convertirlo al formato SecureString:
$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force -AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPasswordPuede exportar la clave pública del certificado de la siguiente manera (la clave privada no se incluye en la exportación):
Export-Certificate -Cert Cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\tstcert.cerAsegúrese de que el archivo de certificado *.CER (PFX) aparezca en el directorio especificado. Si hace clic con el botón derecho en él y selecciona el elemento de menú "Instalar certificado", puede usar el Asistente de importación de certificados para agregar el certificado a los certificados raíz de confianza en su computadora.
Seleccione la ubicación del almacén de certificados -> Máquina local, coloque todos los certificados en el siguiente almacén -> 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:\ps\export-certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullNamePuede implementar esta clave pública o el archivo de certificado en todos los equipos y servidores de los usuarios en el dominio de Active Directory mediante GPO (¿Cómo implementar certificados para usuarios con GPO?).
Generación de un certificado autofirmado para la firma de código en Windows
En PowerShell 3.0, el cmdlet New-SelfSifgnedCertificate solo genera certificados SSL que no se pueden usar para firmar el código del controlador, la aplicación o la secuencia de comandos (a diferencia de los certificados generados por la utilidad MakeCert).
Puede usar el cmdlet New-SelfSifgnedCertificate para emitir certificados de Firma de código en PowerShell versión 5.0 y posteriores.
Puede actualizar su versión de PowerShell de acuerdo con la guía.
Para crear un certificado autofirmado para firmar el código de la aplicación, ejecute el comando:
$cert = New-SelfSignedCertificate -Subject "My Code Signing Certificate” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\MyAhora puede firmar su archivo de script de PowerShell con un certificado autofirmado:
Set-AuthenticodeSignature -FilePath C:\PS\my_posh_script.ps1 -Certificate $certSi recibe una advertencia de Error desconocido al ejecutar el comando, esto significa que el certificado no es de confianza, ya que se encuentra en el almacén de certificados personales del usuario.
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 actualice las listas de certificados raíz de confianza).
Move-Item -Path $cert.PSPath -Destination "Cert:\CurrentUser\Root"Ahora puede usar este certificado autofirmado para firmar sus scripts, controladores o aplicaciones de PowerShell.
Crear un certificado SSL autofirmado SHA-256 en IIS en Windows Server
Tenga en cuenta que al crear un certificado autofirmado para IIS a través de la consola de Internet Information Manager (usando el elemento del menú de acción Crear certificado autofirmado), se crea un certificado SSL usando el algoritmo de cifrado SHA-1. Muchos navegadores consideran que dichos certificados no son de confianza y no se pueden usar para establecer una conexión segura (o es posible que vea otras advertencias y errores de SSL). El cmdlet New-SelfSignedCertificate le permite crear un tipo de certificado más popular mediante el algoritmo de cifrado SHA-256.
Puede vincular un certificado SHA-256 autofirmado generado con PowerShell a un sitio de IIS en Windows Server. Si creó un certificado SSL con PowerShell y lo colocó en el almacén de certificados de la computadora, estará disponible automáticamente para los sitios de IIS.
Abra la consola del Administrador de IIS (
inetmgr.exe), seleccione su sitio y luego seleccione el certificado que creó en las opciones de Enlace del sitio. Guarde sus cambios.
También puede vincular un certificado SSL por su huella digital a un sitio de IIS:
New-IISSiteBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbPrint $yourCert.Thumbprint -CertStoreLocation "Cert:\LocalMachine\My" -Protocol https











