Certificados SSL/TLS: Guía Completa de Generación y Conversión entre Formatos
Índice
Introducción
Los certificados SSL/TLS son fundamentales para proteger los datos en tránsito en Internet. Ya sea administrador de infraestructura, desarrollador o gestor de TI, es esencial comprender cómo generar, convertir y gestionar estos certificados.
En esta guía, aprenderá:
-
Cómo generar certificados Let's Encrypt usando Certbot
-
Los principales formatos de certificado y sus diferencias
-
Cómo convertir certificados entre diversos formatos (.PEM, .PFX, .P12, .DER, .CRT, .KEY)
-
Buenas prácticas de seguridad y almacenamiento
-
Soluciones para problemas comunes
Este artículo está dirigido a profesionales de infraestructura, DevOps y administradores de sistemas en entornos corporativos.
¿Qué es un Certificado SSL/TLS?
Un certificado SSL/TLS es un documento digital que:
-
Autentica la identidad de un servidor web
-
Cifra la comunicación entre cliente y servidor
-
Valida la confiabilidad de un sitio
Componentes de un Certificado
Un certificado típico contiene:
Certificate (Certificado X.509)
├── Dominios autorizados (CN, SAN)
├── Validade (Data de emissão e expiração)
├── Chave Pública
└── Assinatura da Autoridade Certificadora
Private Key (Chave Privada)
└── Deve ser mantida segura em todas as circunstâncias
Chain (Cadeia de Certificados)
└── Certificados intermediários para validação
¿Por qué diferentes formatos?
Diferentes aplicaciones y plataformas soportan formatos distintos:
-
Servidores web (Nginx, Apache): generalmente usan .PEM
-
Windows/IIS: frecuentemente requieren .PFX o .P12
-
Aplicaciones Java: pueden usar .JKS o .P12
-
Dispositivos de red: a veces usan .DER o .CRT
Formatos de Certificado Explicados
PEM (Privacy Enhanced Mail)
-
Extensión:
.pem,.crt,.key -
Contenido: Texto ASCII con delimitadores
-----BEGIN/END -
Componentes: Soporta clave privada, certificado y cadena de certificados en archivos separados o únicos
-
Usado en: Nginx, Apache, OpenSSL, Linux/Unix
-
Ejemplo:
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7...
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKZ6gLSQ8Y/sMA0GCSqGSIb3DQEBAQUAD...
-----END CERTIFICATE-----
PFX y P12 (PKCS#12)
-
Extensión:
.pfx,.p12 -
Contenido: Binario (formato propietario)
-
Componentes: Contiene certificado, clave privada y cadena en un único archivo
-
Protección: Protegido por contraseña
-
Usado en: Windows/IIS, algunas aplicaciones Java, exportación/backup
-
Ventaja: Archivo único, portátil, protegido por contraseña
DER (Distinguished Encoding Rules)
-
Extensión:
.der,.cer -
Contenido: Binario
-
Componentes: Solo certificado público (sin clave privada)
-
Usado en: Sistemas que solo necesitan validar certificados
-
Nota: No recomendado para producción de forma aislada
CRT (Certificate)
-
Extensión:
.crt -
Contenido: Puede ser PEM o DER
-
Nota: Misma función que .cer; el formato varía según el sistema
KEY (Private Key)
-
Extensión:
.key -
Contenido: Generalmente PEM
-
Nota: Contiene solo la clave privada
-
Seguridad: Crítico mantener protegido y con permisos restringidos (chmod 400/600)
CSR (Certificate Signing Request)
-
Extensión:
.csr -
Contenido: Solicitud para que la CA firme un certificado
-
Nota: No es un certificado; será firmado para generar el certificado final
Generación de Certificados con Let's Encrypt y Certbot
Prerrequisitos
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install certbot
# RHEL/CentOS
sudo yum install certbot
# Validar instalación
certbot --version
Método 1: Desafío DNS (Recomendado para Wildcards)
Este método es ideal para certificados wildcard (*.exemplo.com.br) y entornos sin servidor web directo.
Paso 1: Generar el Certificado
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d "*.exemplo.com.br" \
-d "exemplo.com.br" \
--agree-tos \
--email [email protected]
Parámetros explicados:
-
certonly: Genera solo el certificado, sin modificar configuraciones -
--manual: Permite control total del proceso -
--preferred-challenges dns: Usa validación DNS -
-d: Define dominios (repetir para múltiples) -
--agree-tos: Acepta los términos de servicio -
--email: Contacto para notificaciones de renovación
Paso 2: Validar el Desafío DNS
Certbot solicitará que agregue un registro TXT en el DNS:
_acme-challenge.exemplo.com.br. IN TXT "xxxxxxxxxxxxxxxxxxxxx"
En su proveedor de DNS (Cloudflare, Route53, etc.):
-
Acceda al panel de DNS
-
Cree un nuevo registro TXT con la clave proporcionada
-
Espere la propagación (hasta 2 minutos)
-
Presione Enter en Certbot para continuar
Paso 3: Validar la Instalación
Los certificados se guardarán en:
/etc/letsencrypt/live/exemplo.com.br/
├── cert.pem # Su certificado
├── privkey.pem # Su clave privada
├── chain.pem # Certificados intermedios
└── fullchain.pem # Certificado + cadena
Método 2: Desafío HTTP (Recomendado para Desarrollo)
Si tiene un servidor web en funcionamiento:
sudo certbot certonly \
--webroot \
-w /var/www/html \
-d "exemplo.com.br" \
--agree-tos \
--email [email protected]
Renovación Automática
# Testar renovación
sudo certbot renew --dry-run
# Certbot configura renovación automática via systemd o cron
# Validar:
sudo systemctl status certbot.timer # Systemd
sudo crontab -l # Cron
Conversión entre Formatos
1. PEM a PFX/P12
Combina certificado, clave privada y cadena en un único archivo protegido por contraseña.
Paso a Paso
# Navegar al directorio de certificados
cd /etc/letsencrypt/live/exemplo.com.br/
# Convertir a PFX
openssl pkcs12 -export \
-out exemplo.com.br.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem
Qué sucede:
-
OpenSSL solicitará una contraseña de protección
-
El archivo
.pfxserá creado -
Este archivo puede ser transportado con seguridad
Sintaxis detallada:
openssl pkcs12 -export # Exportar a PKCS#12
-out archivo.pfx # Archivo de salida
-inkey privkey.pem # Clave privada
-in cert.pem # Certificado público
-certfile chain.pem # Certificados intermedios
Opcional - Sin protección por contraseña (no recomendado):
openssl pkcs12 -export \
-out exemplo.com.br.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem \
-passout pass:
2. PFX/P12 a PEM
Extrae componentes individuales de un archivo PFX.
Extraer Certificado
openssl pkcs12 -in exemplo.com.br.pfx \
-clcerts \
-nokeys \
-out cert.pem \
-legacy
Parámetros:
-
-clcerts: Incluye solo certificados de cliente -
-nokeys: No incluye claves privadas -
-legacy: Compatibilidad con certificados antiguos
Extraer Clave Privada
openssl pkcs12 -in exemplo.com.br.pfx \
-nocerts \
-out privkey.pem \
-nodes \
-legacy
Parámetros:
-
-nocerts: No incluye certificados -
-nodes: No cifra la clave privada (salida en texto plano) -
-legacy: Compatibilidad con formatos antiguos
Extraer Cadena de Certificados
openssl pkcs12 -in exemplo.com.br.pfx \
-nokeys \
-cacerts \
-out chain.pem \
-legacy
Parámetros:
-
-cacerts: Extrae solo certificados de la CA
Script Automatizado para Extracción Completa
#!/bin/bash
arquivo_pfx="exemplo.com.br.pfx"
senha="sua_senha_aqui"
echo "Extraindo certificado..."
openssl pkcs12 -in "$arquivo_pfx" \
-clcerts -nokeys -out cert.pem \
-passin pass:"$senha" -legacy
echo "Extraindo chave privada..."
openssl pkcs12 -in "$arquivo_pfx" \
-nocerts -out privkey.pem \
-nodes -passin pass:"$senha" -legacy
echo "Extraindo cadeia..."
openssl pkcs12 -in "$arquivo_pfx" \
-nokeys -cacerts -out chain.pem \
-passin pass:"$senha" -legacy
echo "Concluído! Arquivos gerados:"
ls -lh cert.pem privkey.pem chain.pem
3. PEM a DER
Convierte formato de texto a binario.
openssl x509 -in cert.pem -outform DER -out cert.der
4. DER a PEM
Convierte formato binario a texto.
openssl x509 -in cert.der -inform DER -out cert.pem
5. Extraer Clave Privada de PEM Combinado
Si tiene un archivo PEM con certificado y clave:
openssl pkey -in arquivo_combinado.pem -out privkey.pem
6. Crear Certificado Único PEM (fullchain)
cat cert.pem chain.pem > fullchain.pem
Tabla de Referencia Rápida
Buenas Prácticas y Seguridad
1. Protección de Claves Privadas
# Definir permisos correctos (solo lectura para owner)
chmod 400 privkey.pem
# Verificar propietario
ls -lh privkey.pem
# Debe ser: -r-------- 1 root root
# Nunca commit en Git (adicionar al .gitignore)
echo "privkey.pem" >> .gitignore
echo "*.pfx" >> .gitignore
2. Backup Seguro
# Crear backup cifrado
tar czf - /etc/letsencrypt/ | \
openssl enc -aes-256-cbc -salt -out certs_backup.tar.gz.enc
# Restaurar backup
openssl enc -d -aes-256-cbc -in certs_backup.tar.gz.enc | tar xz
3. Validación de Certificados
# Verificar validez
openssl x509 -in cert.pem -text -noout | grep -A2 "Validity"
# Verificar dominios (CN y SAN)
openssl x509 -in cert.pem -text -noout | grep -A1 "Subject:"
openssl x509 -in cert.pem -text -noout | grep "DNS:"
# Verificar emisión y expiración
openssl x509 -in cert.pem -noout -dates
4. Corresponder Clave y Certificado
# Calcular hash de la clave privada
openssl pkey -in privkey.pem -pubout -outform pem | \
openssl dgst -sha256 -hex
# Calcular hash del certificado
openssl x509 -in cert.pem -pubkey -noout | \
openssl dgst -sha256 -hex
# Si los hashes son iguales, la clave y certificado combinan
5. Monitoreo de Expiración
#!/bin/bash
# Script para alertar sobre certificados expirando
cert_file="cert.pem"
dias_alerta=30
dias_restantes=$(openssl x509 -in "$cert_file" -noout -dates | \
grep "notAfter" | cut -d= -f2 | \
xargs -I {} date -d {} +%s | \
awk "{print int(($1 - $(date +%s))/86400)}")
if [ "$dias_restantes" -lt "$dias_alerta" ]; then
echo "ALERTA: Certificado expira em $dias_restantes dias!"
# Enviar email, Slack, etc.
fi
6. Configuración de Nginx con Certificados
server {
listen 443 ssl http2;
server_name exemplo.com.br www.exemplo.com.br;
ssl_certificate /etc/letsencrypt/live/exemplo.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemplo.com.br/privkey.pem;
# Protocolos seguros
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# HSTS (recomendado)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Seu conteúdo aqui
root /var/www/html;
index index.html;
}
# Redirecionar HTTP para HTTPS
server {
listen 80;
server_name exemplo.com.br www.exemplo.com.br;
return 301 https://$server_name$request_uri;
}
7. Configuración de Apache con Certificados
<VirtualHost *:443>
ServerName exemplo.com.br
ServerAlias www.exemplo.com.br
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/exemplo.com.br/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/exemplo.com.br/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/exemplo.com.br/chain.pem
# Protocolos seguros
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite HIGH:!aNULL:!MD5
# HSTS
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
DocumentRoot /var/www/html
</VirtualHost>
<VirtualHost *:80>
ServerName exemplo.com.br
ServerAlias www.exemplo.com.br
Redirect permanent / https://exemplo.com.br/
</VirtualHost>
Solución de Problemas Comunes
Error: "mac verify failure" al extraer PFX
# Generalmente causado por contraseña incorrecta
openssl pkcs12 -in archivo.pfx -text -passin pass:suasenha
Solución:
# Intente con -legacy
openssl pkcs12 -in archivo.pfx -nodes -out temp.pem -legacy
Error: "Unable to load certificate" en Nginx
# Validar sintaxis
nginx -t
# Verificar permisos
ls -lh /etc/letsencrypt/live/seu-dominio/
# Certificado debe ser legible por nginx
sudo chown root:root /etc/letsencrypt/
sudo chmod 755 /etc/letsencrypt/
Error: "certificate required" al usar PFX sin cadena
# Certificado incompleto, recree con -certfile
openssl pkcs12 -export \
-out completo.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem # No olvidar este archivo
IIS No Reconoce PFX
# Windows requiere formato específico
openssl pkcs12 -export \
-out archivo.pfx \
-inkey privkey.pem \
-in cert.pem \
-certfile chain.pem \
-name "Friendly Name"
Certificado Incompatible después de la Actualización de Let's Encrypt
# Let's Encrypt cambió a ECDSA en 2024
# Si necesita RSA:
sudo certbot certonly \
--manual \
--key-type rsa \
--rsa-key-size 2048 \
-d seu-dominio.com.br
Verificar Certificado Instalado en el Servidor
# Via SSH (Linux)
echo | openssl s_client -servername exemplo.com.br -connect exemplo.com.br:443 2>/dev/null | \
openssl x509 -noout -dates -subject
# Via CLI (cualquier SO)
openssl s_client -connect exemplo.com.br:443 -showcerts < /dev/null
Conclusión
Los certificados SSL/TLS son fundamentales para la seguridad moderna. Esta guía cubrió:
✅ Generación mediante Let's Encrypt y Certbot
✅ Conversión entre formatos PEM, PFX, DER
✅ Buenas prácticas de seguridad y protección
✅ Solución de problemas de problemas comunes
Próximos Pasos
-
Revise sus políticas de backup y rotación de certificados
-
Implemente monitoreo de expiración
-
Configure HSTS y otros encabezados de seguridad
-
Pruebe la renovación automática regularmente
-
Mantenga registros de auditoría de cambios
Recursos Adicionales
¿Dudas o sugerencias? Deje un comentario abajo o contacte a nuestro equipo de infraestructura.
Última actualización: Agosto de 2026
Seguir leyendo
Lea también
TutoriaisManual LSI / Broadcom MegaRAID — MegaCli y StorCLI
Con esta guía, su equipo gana autonomía para diagnosticar rebuilds, resolver foreign configurations, gestionar BBU y CacheCade — con escenarios reales de producción documentados.
20 min de leitura
Nginx Cheatsheet
Guía de bolsillo con ejemplos listos para configurar Nginx en producción: desde instalación y virtual hosts hasta ajuste de rendimiento y resolución de problemas.
12 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa
Qué prometer, cómo medir y qué hacer cuando el error se dispara: SLI, SLO, presupuesto de error, alertas que despiertan a alguien y postmortem sin caza de brujas.
5 min de leitura
Comentarios
Aún sin comentarios
Sea el primero en compartir su opinión sobre este artículo.

Deje un comentario