Cómo convertir un certificado CRT a PEM

Has recibido el certificado de tu sitio web de la entidad emisora en un archivo con extensión .crt y tu servidor (Apache, Nginx, HAProxy, un balanceador, una herramienta de línea de comandos o una aplicación) te pide un archivo .pem. La buena noticia es que, en la mayoría de los casos, la conversión es trivial, y a veces ni siquiera hace falta. La clave está en saber qué contiene realmente tu archivo. En esta guía aprenderás a distinguir los formatos de certificado, a convertir un CRT a PEM con OpenSSL, con las herramientas de Windows y con PowerShell, y a resolver los errores más comunes.
Qué son CRT, CER, PEM, DER y PFX
Los nombres de archivo de los certificados generan mucha confusión porque mezclan dos conceptos distintos: la codificación y la extensión.
- PEM: es una codificación, no un tipo de certificado. Es texto en Base64 delimitado por las líneas
-----BEGIN CERTIFICATE-----y-----END CERTIFICATE-----. Es el formato habitual en Linux y en servidores web. - DER: el mismo certificado en formato binario, sin texto legible. Es habitual en Windows y en Java.
- CRT y CER: son solo extensiones de archivo. Un
.crtpuede contener un certificado en PEM o en DER; la extensión no lo indica. Por eso a veces solo hay que cambiarle el nombre. - PFX / P12: un contenedor protegido con contraseña que incluye el certificado, la clave privada y, a menudo, la cadena de certificación. Es el formato típico de exportación de Windows.
- KEY: la clave privada, normalmente en PEM. Nunca la compartas.
Paso 1: averigua qué formato tiene tu archivo
Abre el archivo .crt con el Bloc de notas. Si ves texto que empieza por -----BEGIN CERTIFICATE-----, ya es un PEM y solo necesitas cambiarle la extensión a .pem si tu aplicación lo exige (el contenido es el mismo). Si ves símbolos ilegibles, es DER y hay que convertirlo. También puedes comprobarlo desde PowerShell:
Get-Content .\certificado.crt -TotalCount 1
# Si devuelve -----BEGIN CERTIFICATE----- ya es PEM
Método 1: convertir con OpenSSL (el más habitual)
OpenSSL está instalado por defecto en la mayoría de distribuciones Linux y en macOS. Para un archivo DER, el comando es:
openssl x509 -inform DER -in certificado.crt -out certificado.pem -outform PEM
Si el archivo ya era PEM y solo quieres normalizarlo (o comprobar que es válido), omite la codificación de entrada:
openssl x509 -in certificado.crt -out certificado.pem
Para comprobar el resultado y leer los datos del certificado (emisor, fechas de validez, nombres alternativos), usa:
openssl x509 -in certificado.pem -text -noout
openssl x509 -in certificado.pem -noout -subject -issuer -dates
Instalar OpenSSL en Windows
Windows no incluye OpenSSL, pero hay varias formas de tenerlo. Si ya tienes Git para Windows, trae un openssl.exe en C:\Program Files\Git\usr\bin. También puedes instalarlo con el gestor de paquetes de Windows:
winget install ShiningLight.OpenSSL.Light
Después de instalar, abre una nueva ventana de terminal para que se actualice la ruta, y comprueba que funciona con openssl version.
Método 2: convertir con herramientas de Windows, sin OpenSSL
Con certutil
certutil está incluido en Windows y convierte entre binario y Base64 con una sola línea:
# De DER (binario) a PEM (Base64 con cabeceras)
certutil -encode certificado.crt certificado.pem
# Al revés: de PEM a DER
certutil -decode certificado.pem certificado-der.crt
El archivo resultante lleva las cabeceras -----BEGIN CERTIFICATE----- y -----END CERTIFICATE-----, por lo que es un PEM válido para la mayoría de aplicaciones. Si algún programa se queja del formato, abre el resultado con el Bloc de notas y comprueba que no hay líneas en blanco al principio.
Con el asistente de exportación de certificados
- Haz doble clic en el archivo
.crty abre la pestaña Detalles, o importa el certificado encertmgr.msc(usuario) ocertlm.msc(equipo). - Haz clic en Copiar en archivo (o clic derecho → Todas las tareas → Exportar).
- En el formato, elige X.509 codificado base 64 (.CER).
- Guarda el archivo y cámbiale la extensión a
.pem.
La opción «codificado base 64» genera exactamente el formato PEM; «binario codificado DER» genera el binario. No exportes la clave privada si solo necesitas el certificado.
Método 3: con PowerShell
Si el certificado está en el almacén de Windows, puedes generar el PEM directamente con PowerShell, sin ningún programa adicional:
$cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object Subject -like '*midominio.com*' | Select-Object -First 1
$b64 = [Convert]::ToBase64String($cert.RawData, [Base64FormattingOptions]::InsertLineBreaks)
"-----BEGIN CERTIFICATE-----`r`n$b64`r`n-----END CERTIFICATE-----" | Set-Content -Path .\certificado.pem -Encoding ascii
Y para un archivo .crt o .cer en disco:
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new((Resolve-Path .\certificado.crt).Path)
$cert | Format-List Subject, Issuer, NotBefore, NotAfter, Thumbprint
La segunda línea te permite verificar que el archivo es un certificado válido antes de convertirlo. Si las tareas de conversión forman parte de un proceso que repites (renovaciones periódicas, por ejemplo), puedes automatizarlas: te explicamos cómo en la guía de programar tareas con PowerShell.
Cadenas de certificados: el fichero «fullchain»
Los servidores web necesitan, además del certificado, los certificados intermedios de la entidad emisora; de lo contrario, algunos navegadores y clientes mostrarán errores de confianza. Cuando una aplicación pide un archivo con la cadena completa, concatena los certificados en este orden: primero el del servidor, después los intermedios, y opcionalmente al final el raíz.
# Linux / macOS
cat certificado.pem intermedio.pem raiz.pem > fullchain.pem
# PowerShell
Get-Content certificado.pem, intermedio.pem, raiz.pem | Set-Content fullchain.pem -Encoding ascii
Convertir un PFX a PEM
Si exportaste el certificado desde Windows como .pfx y tu servidor Linux necesita PEM, OpenSSL lo extrae. Te pedirá la contraseña del archivo:
# Solo el certificado
openssl pkcs12 -in certificado.pfx -clcerts -nokeys -out certificado.pem
# Solo la clave privada, sin cifrar (protégela bien)
openssl pkcs12 -in certificado.pfx -nocerts -nodes -out clave.pem
# La cadena de certificados intermedios
openssl pkcs12 -in certificado.pfx -cacerts -nokeys -chain -out cadena.pem
La clave privada resultante está en texto claro, así que guárdala con permisos restrictivos (en Linux, chmod 600 clave.pem) y no la subas a repositorios ni la envíes por correo.
Comprobar que el certificado y la clave coinciden
Un error frecuente al instalar certificados es usar una clave que no corresponde. Compara el «módulo» de ambos: deben dar el mismo resultado.
openssl x509 -noout -modulus -in certificado.pem | openssl md5
openssl rsa -noout -modulus -in clave.pem | openssl md5
Si las dos sumas son idénticas, el par es correcto. Si no lo son, estás mezclando archivos de certificados distintos (por ejemplo, de una renovación anterior).
Usar el PEM en Apache o Nginx
Una vez que tienes los archivos en formato PEM, se referencian en la configuración del sitio. En Apache:
SSLCertificateFile /etc/ssl/certs/certificado.pem
SSLCertificateKeyFile /etc/ssl/private/clave.pem
# En las versiones recientes de Apache basta con apuntar SSLCertificateFile a un fullchain.pem.
# En las antiguas, la cadena intermedia se indica aparte:
SSLCertificateChainFile /etc/ssl/certs/cadena.pem
Si estás montando tu servidor desde cero, tienes el procedimiento completo en la guía para instalar un servidor web con Apache en Ubuntu, incluida la opción de un certificado gratuito de Let’s Encrypt que se genera ya en PEM y se renueva solo. Para moverte con soltura por los archivos y permisos de un servidor Linux, repasa los comandos básicos de la terminal de Linux.
Comprobar la caducidad antes de instalarlo
Antes de instalar un certificado convertido, comprueba su fecha de caducidad y que no está a punto de vencer. Estas dos órdenes lo hacen sin abrir ningún editor: la primera muestra la fecha final y la segunda devuelve un aviso si el certificado caduca dentro de los próximos 30 días (2.592.000 segundos):
openssl x509 -in certificado.pem -noout -enddate
openssl x509 -in certificado.pem -noout -checkend 2592000
Este control es muy útil dentro de un script de supervisión que te avise semanas antes del vencimiento, en lugar de enterarte cuando los usuarios ven el aviso de certificado caducado en el navegador.
Errores frecuentes
unable to load certificateowrong tag/Expecting: TRUSTED CERTIFICATE: has indicado un formato de entrada equivocado. Si tu archivo es PEM, no uses-inform DER; si es DER, indícalo.no start line: el archivo no contiene la cabecera PEM esperada. Ábrelo con un editor: puede ser binario, o tener líneas en blanco o texto extra antes delBEGIN.- El archivo contiene varios certificados:
openssl x509solo lee el primero. Para procesar una cadena entera usaopenssl crl2pkcs7 -nocrl -certfile cadena.pem | openssl pkcs7 -print_certs -text -noout. - Problemas de saltos de línea: un PEM editado en Windows con saltos CRLF suele funcionar, pero algunas herramientas Linux exigen LF. Si da error, convierte los saltos con
dos2unix certificado.pem. - Certificado correcto, pero el navegador avisa de que no es de confianza: falta el certificado intermedio en la cadena.
Preguntas frecuentes
¿Es lo mismo .crt, .cer y .pem?
No exactamente: .crt y .cer son extensiones que pueden contener PEM o DER, mientras que .pem designa siempre texto en Base64. Por eso conviene comprobar el contenido antes de convertir.
¿Pierdo algo al convertir de CRT a PEM?
No. Es el mismo certificado con una codificación distinta; los datos y la firma no cambian.
¿Puedo convertir una clave privada de la misma forma?
Las claves tienen sus propios formatos (PKCS#1, PKCS#8) y comandos distintos: openssl rsa o openssl pkey. No uses x509 con una clave.
Conclusión
Para pasar un certificado de CRT a PEM, mira primero el contenido del archivo: si ya es texto Base64 con cabeceras BEGIN CERTIFICATE, basta con renombrarlo. Si es binario (DER), conviértelo con openssl x509 -inform DER o, en Windows, con certutil -encode. Monta la cadena completa en el orden correcto, comprueba que certificado y clave coinciden, y protege siempre la clave privada.