Búsqueda de sitios web

Nuevo certificado autofirmado: creación de certificados con PowerShell


¿Necesita un certificado SSL para el desarrollo de sitios web o aplicaciones de prueba? En lugar de comprar costosos certificados digitales de proveedores externos, ¿por qué no crear usted mismo un certificado autofirmado? No te preocupes; PowerShell lo cubrió con el cmdlet New-SelfSignedCertificate.

En este tutorial, aprenderá cómo crear nuevos certificados autofirmados en PowerShell utilizando varios ejemplos. Al final, habrá creado certificados autofirmados con diferentes propiedades y para diferentes propósitos. ¡Empecemos!

Requisitos previos

Si desea seguir este tutorial práctico, asegúrese de cumplir con los siguientes requisitos.

  • Una computadora con Windows con Windows PowerShell 5.1 o la última versión de PowerShell 7 (v7.1.3 al momento de escribir este artículo). Este tutorial utilizará Windows 10 versión 2004 y Windows PowerShell 5.1.
  • Su cuenta de usuario debe tener derechos de administrador en la máquina local.
  • A lo largo de este artículo, utilizará una sesión elevada de PowerShell (ejecutar como administrador) y asume que ya tiene una abierta.

Crear un certificado con un solo asunto

Cuando necesite crear certificados autofirmados en PowerShell, el cmdlet New-SelfSignedCertificate es su amigo. Este cmdlet le ayudará a crear certificados para diferentes propósitos, como firma de código, autenticación de servidor y cifrado de documentos, por nombrar algunos.

Para crear un certificado autofirmado con un solo asunto, como una única URL de sitio web o un FQDN de servidor, el cmdlet New-SelfSignedCertificate solo requiere el parámetro Subject. Puede pensar en el asunto como una etiqueta única para el certificado que lo diferencia de otros certificados.

Por ejemplo, ejecute el siguiente comando en PowerShell para crear un certificado autofirmado para un sitio web llamado LocalSite.com. Este ejemplo creará el certificado en el almacén de certificados personales de la máquina local para la autenticación del servidor. Para los servicios web, es común utilizar la URL del sitio web que protegerá un certificado como nombre del sujeto.

Los certificados en el almacén de certificados de la máquina local están disponibles globalmente para todos los usuarios en la computadora local. En comparación, los certificados en el almacén de certificados del usuario actual solo están disponibles para el usuario actual.

# Create a self-signed certificate in the local machine personal certificate store and store the result in the $cert variable.
$cert = New-SelfSignedCertificate -Subject localsite.com
# Display the new certificate properties
$cert | Format-List -Property *

Para crear el nuevo certificado en el almacén de certificados personales del usuario actual (Cert:\CurrentUser\My), agregue el parámetro -Certstorelocation Cert:\CurrentUser\My o en el almacén de la autoridad de certificación raíz de confianza utilice Cert:\LocalMachine\Root.

La siguiente captura de pantalla muestra el resultado esperado después de crear el certificado y mostrar todas sus propiedades. Puede ver que el cmdlet selfsignedcertificate agrega automáticamente el prefijo CN= al nombre del sujeto.

Creación de un certificado de nombre alternativo del sujeto (SAN)

Ha creado un certificado con un único nombre de sujeto, lo cual es bueno si lo implementa en un sitio web. Pero, ¿qué pasa si tiene varios sitios web como localsite.com content.localsite.com y apps.localsite.com?

En lugar de crear un certificado autofirmado para cada sitio web, puede crear un certificado con varios nombres alternativos de sujeto (SAN). Este tipo de certificado se denomina certificado SAN.

Para crear un certificado SAN, ejecute New-SelfSignedCertificate con el parámetro DnsName. El parámetro DnsName acepta uno o más nombres de sujeto que desea incluir en el certificado.

Cuando proporciona varios valores al parámetro DnsName, la primera cadena del parámetro DnsName aparecerá como el nombre del sujeto principal del certificado. Los otros nombres serán los nombres alternativos. Cualquiera que sea el nombre del sujeto principal, no afecta la usabilidad del certificado y funcionará igual.

Por ejemplo, para crear el certificado SAN para localsite.com, content.localsite.com y apps.localsite.com, ejecute el comando a continuación en PowerShell.

# Create a self-signed SAN certificate in the local machine personal certificate store and store the result in the $cert variable.
$cert = New-SelfSignedCertificate -DnsName localsite.com,content.localsite.com,apps.localsite.com
# Display the new certificate properties
$cert | Format-List -Property *

Como puede ver a continuación, el cmdlet creó un nuevo certificado con varios nombres de sujeto, como se muestra en la propiedad DnsNameList.

Crear un certificado con un período de validez específico

De forma predeterminada, los certificados autofirmados son válidos por un año, lo que podría ser suficiente para la mayoría de los casos de uso. Pero si necesita especificar un período de validez específico al crear un certificado autofirmado, puede agregar los parámetros NotBefore y NotAfter.

Por ejemplo, para crear un certificado autofirmado válido NotBefore hoy y NotAfter dentro de 24 meses, ejecute el siguiente comando en PowerShell.

# Create a self-signed certificate in the local machine personal certificate store valid for 24 months and store the result in the $cert variable.
$cert = New-SelfSignedCertificate -DnsName localsite.com -NotAfter (Get-Date).AddMonths(24)

Para confirmar el nuevo certificado, ejecute el siguiente comando para mostrar las propiedades seleccionadas del certificado, incluidas las fechas de inicio y vencimiento.

$cert | Select-Object -Property Subject,Thumbprint,NotBefore,NotAfter

Puede ver en el resultado que ahora tiene un certificado autofirmado con una validez de 24 meses.

Clonar un certificado autofirmado existente

Supongamos que su certificado autofirmado está a punto de caducar. Si aún necesitas el certificado, entonces la acción lógica es renovarlo. Pero no existe una forma directa de renovar el certificado. ¿A qué te dedicas? Cree un nuevo certificado autofirmado desde cero o clone el certificado existente.

La clonación del certificado anterior hace que el nuevo certificado herede las propiedades del certificado anterior, excluyendo la clave pública, la huella digital, el número de serie y la fecha de vencimiento. Por este motivo, clonar el certificado antiguo es la opción más rápida.

Para clonar un certificado, agregue el parámetro CloneCert al comando New-SelfSignedCertificate. Siga los pasos a continuación:

1. Primero, busque el certificado que desea clonar. Para hacerlo, ejecute el comando Get-ChildItem para enumerar los certificados existentes en el almacén de certificados. En el siguiente fragmento, PowerShell busca en el almacén de certificados de la máquina local todos los certificados con un asunto que termina en la cadena localsite.com y devuelve algunos atributos de certificado.

# Get all certificates whose Subject name is like localsite.com.
 Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*localsite.com"} | Select-Object Subject,DnsNameList,Thumbprint,NotBefore,NotAfter

Como puede ver a continuación, podría haber más de un certificado que coincida con el nombre del sujeto que busca. En cuyo caso, inspeccione la lista de certificados para determinar qué certificado clonar. Una vez que haya decidido, copie la huella digital del certificado.

2. Ahora que ha determinado el certificado que desea clonar y ha copiado su huella digital, ejecute el siguiente comando para recuperar el certificado anterior. Asegúrese de cambiar el valor de Thumbprint por la huella digital que copió en el paso anterior.

# Get the certificate and store it in the $certToClone variable
 $certToClone = Get-Item Cert:\LocalMachine\My\

3. A continuación, cree un nuevo certificado clonando el original ejecutando New-SelfSignedCertificate con el parámetro CloneCert.

# Create cloned self-signed certificate
 $cert = New-SelfSignedCertificate -CloneCert $certToClone

Sin especificar los parámetros NotBefore y NotAfter, el nuevo certificado tendrá el mismo período de validez que el certificado anterior (es decir, dos años). El valor NotBefore será la fecha y hora actuales menos diez minutos.

Alternativamente, para darle al nuevo certificado un período de validez diferente, ejecute el mismo comando pero agregue el parámetro NotAfter. Por ejemplo, para que el certificado sea válido durante cuatro años, ejecute el siguiente comando.

# Create cloned self-signed certificate valid for four years
 $cert = New-SelfSignedCertificate -CloneCert $certToClone -NotAfter (Get-Date).AddYears(4)

4. Finalmente, ejecute el siguiente comando para verificar el nuevo certificado que ha creado.

# Display the cloned certificate properties
 $cert | Select-Object Subject,DnsNameList,Thumbprint,NotBefore,NotAfter

Como puede ver a continuación, ahora ha clonado el certificado autofirmado con el mismo asunto y nombres alternativos que el original. La huella digital, la fecha de inicio y la fecha de vencimiento son nuevas.

Crear un certificado de firma de código

Para asegurarse de que su secuencia de comandos o código lleve una firma digital, debe firmar sus secuencias de comandos utilizando un certificado de firma de código. El cmdlet New-SelfSignedCertificate también es capaz de crear certificados de firma de código.

Para crear un certificado de firma de código autofirmado, ejecute el comando New-SelfSignedCertificate a continuación en PowerShell. El parámetro Type especifica la creación de un tipo de certificado CodeSigningCert. El certificado tendrá una validez de 24 meses. Tenga en cuenta que asignar un período de validez específico es opcional con el parámetro NotAfter.

# Create a self-signed code signing certificate valid for 24 months.
$cert = New-SelfSignedCertificate -Subject CodeSigningCert -NotAfter (Get-Date).AddMonths(24) -Type CodeSigningCert

Después de generar el certificado de firma de código, ejecute el siguiente comando para confirmar que el valor EnhancedKeyUsageList muestra que el uso de clave válido del certificado es Firma de código.

$cert | Select-Object Subject,EnhancedKeyUsageList

Crear un certificado de cifrado de documentos

Cuando tiene contenidos que desea proteger de miradas indiscretas, como documentos o correos electrónicos, el cifrado es una forma de protegerlos. Pero primero, necesita un tipo de certificado para el cifrado de documentos, que también puede crear utilizando el cmdlet New-SelfSignedCertificate.

Para crear un certificado de cifrado de documentos, el cmdlet New-SelfSignedCertificate requiere un conjunto específico de valores KeyUsage. Estos valores son:

  • Cifrado de datos: el certificado será válido para cifrar datos.
  • KeyEncipherment: el certificado será válido para cifrar claves secretas/privadas.
  • KeyAgreement: el certificado será válido para derivar claves criptográficas, como en la criptografía de curva elíptica.

Además, el valor del parámetro Type debe ser DocumentEncryptionCert.

Ejecute el siguiente comando para crear un certificado autofirmado para el cifrado de documentos. El certificado tendrá una validez de dos años. Para que el comando sea más legible, el siguiente código utiliza símbolos para definir los valores de los parámetros.

Dado que el cifrado de contenido suele ser para uso personal, es apropiado crear el certificado de cifrado del documento en el almacén de certificados personales del usuario actual. Al hacerlo, se restringe el certificado al usuario actual (usted) para cifrar y descifrar contenidos.

# Define the certificate parameter values
$certSplat = @{
	DnsName = 'DocEncCert'
	KeyUsage = @('KeyEncipherment','DataEncipherment','KeyAgreement')
	Type = 'DocumentEncryptionCert'
	CertStoreLocation = 'Cert:\\CurrentUser\\My'
	NotAfter = (Get-Date).AddYears(2)
}
# Create the self-signed document encryption certificate
$cert = New-SelfSignedCertificate @certSplat

A continuación, para verificar que el certificado autofirmado sea válido para la firma de código, ejecute el siguiente comando para obtener el valor EnhancedKeyUsageList del certificado.

$cert | Select-Object Subject,EnhancedKeyUsageList

Como puede ver en el resultado a continuación, el certificado enumera Document Encryption, lo que significa que el certificado es válido para cifrar documentos.

Ahora que tiene un certificado de cifrado de documentos, puede cifrar y descifrar contenidos utilizando los cmdlets Protect-CmsMessage y Unprotect-CmsMessage.

Conclusión

Este artículo tenía como objetivo enseñarle cómo puede adquirir rápidamente certificados autofirmados para sus necesidades de prueba y desarrollo. Aprendió a crear certificados autofirmados utilizando diferentes parámetros y para diferentes propósitos.

Hay más parámetros que puede explorar y que este artículo no cubrió. ¿Qué tal crear un certificado S/MIME para proteger correos electrónicos o certificados con algoritmos más potentes? Probablemente también quieras aprender a exportar e importar esos certificados. ¡Buena suerte!