🔐 Certificados SSL/TLS explicados para desarrolladores (nivel dummy, pero PRO)
Una guía completa y práctica usando un caso real: el WebService HTTPS de SOA Suite en:
https://vsotdcorerh.mi-empresa.mx
Esta guía es para ti si has visto errores como:
PKIX path building failedSEC_ERROR_UNKNOWN_ISSUERunable to find valid certification path
🧭 Índice
- Objetivos
- Conceptos clave
- Cadena de confianza
- Formatos de certificados
- Errores comunes
- Instalación por plataforma
- FAQ
- English Version
🎯 Objetivos de esta guía
- Entender qué es un certificado y por qué existe.
- Aprender qué significan CA Root, CA Intermedia, PEM, CRT, PFX.
- Comprender cómo funciona una cadena de confianza.
- Resolver errores reales como PKIX y UNKNOWN_ISSUER.
- Instalar correctamente certificados en Java, Linux/curl, Navegadores (Angular) y WebLogic.
- Implementar un caso real usando certificados privados de “Mi Empresa”.
🧠 Conceptos clave (explicados con ejemplos reales)
Estructura típica de un certificado digital.
Certificados involucrados (nombres reales del caso):
mi-empresa-root-certificate-authority_ca.crt← CA Rootmi-empresa-intermediate-global-ca.crt← CA Intermediaserver-vsotdcorerh.mi-empresa.mx.crt← Certificado del servidor
La Regla: Si el cliente confía en la Root y la Intermedia, automáticamente confiará en el servidor.
🔸 ¿Qué es HTTPS?
Es un túnel encriptado para conectar cliente ↔ servidor de forma segura.
🔸 ¿Qué es un certificado?
Es la “INE digital” del servidor.
🔸 ¿Qué es una CA?
Es como la SEP de los certificados: firma y valida identidades.
- CA pública: navegadores la reconocen automáticamente (Google, DigiCert).
- CA privada: NO es reconocida por clientes externos sin instalarla manualmente (como la de “Mi Empresa”).
🔗 Cadena de confianza (visual)
Flujo de confianza: Root CA → Intermediate CA → Server Certificate.
[Root CA] ─► [Intermediate CA] ─► [Server Certificate]
│ │ │
│ │ └── Tu SOA Suite
│ └── Firma al servidor
└── Firma a la intermedia
📄 Formatos de certificados (rápido y claro)
| Extensión | Qué es | Llave privada |
|---|---|---|
.crt / .cer |
Certificado público (PEM/Base64) | ❌ No |
.pem |
Contenedor Base64 (uno o varios certs) | ❌/Depende |
.pfx / .p12 |
Certificado + llave privada | ✔ Sí |
.jks |
Keystore Java | ✔/❌ Depende |
⚠️ IMPORTANTE: Nunca compartas llaves privadas (
.key,.pfx,.p12).
🚨 Errores comunes y su significado real
Dónde falla la validación cuando falta un certificado en la cadena.
❌ PKIX path building failed (Java)
Java no reconoce la CA que firmó el certificado del servidor.
Solución: Instalar Root + Intermedia en el cacerts de Java.
❌ SEC_ERROR_UNKNOWN_ISSUER (curl / navegador / Linux)
El sistema operativo no conoce el emisor del certificado.
Solución: Instalar Root + Intermedia en el almacén de confianza del sistema operativo.
🛠 Instalación de certificados por plataforma
Esquema de comunicación: Cliente(s) → Load Balancer → SOA Suite (WebLogic).
🔷 1) Java (cacerts)
Ejecuta esto en tu servidor donde corre el cliente Java:
# Instalar Root
keytool -importcert -file mi-empresa-root-certificate-authority_ca.crt \
-keystore $JAVA_HOME/lib/security/cacerts -alias mi-empresaRootCA -storepass changeit
# Instalar Intermedia
keytool -importcert -file mi-empresa-intermediate-global-ca.crt \
-keystore $JAVA_HOME/lib/security/cacerts -alias mi-empresaIntermediateCA -storepass changeit
Verificación:
keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit | grep mi-empr
🔷 2) Linux (curl, scripts)
Para que comandos como curl o wget funcionen:
sudo cp mi-empresa-root-certificate-authority_ca.crt /etc/pki/ca-trust/source/anchors/
sudo cp mi-empresa-intermediate-global-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
Verificación:
curl -v [https://vsotdcorerh.mi-empresa.mx](https://vsotdcorerh.mi-empresa.mx)
🔷 3) Navegador (Angular / Chrome)
Si tu aplicación Frontend (Angular/React) da error al consumir el servicio:
Windows:
- Doble clic al
.crt→ “Instalar certificado”. - Seleccionar “Equipo local”.
- Ubicar manualmente en: Entidades de certificación raíz de confianza.
macOS:
- Abrir Keychain Access.
- Arrastrar el certificado a System.
- Doble clic → Trust → “Always Trust”.
🔷 4) WebLogic
Si WebLogic es quien consume el servicio:
keytool -importcert -file mi-empresa-root-certificate-authority_ca.crt \
-keystore $DOMAIN_HOME/config/fmwconfig/cacerts -alias mi-empresaRootCA -storepass changeit
keytool -importcert -file mi-empresa-intermediate-global-ca.crt \
-keystore $DOMAIN_HOME/config/fmwconfig/cacerts -alias mi-empresaIntermediateCA -storepass changeit
Nota: Requiere reinicio del dominio.
🧬 Cadena completa (cadena-completa.pem)
A veces necesitas un solo archivo con todo. El orden importa:
- Root
- Intermedia
- Server
Uso rápido para pruebas:
curl --cacert cadena-completa.pem [https://vsotdcorerh.mi-empresa.mx](https://vsotdcorerh.mi-empresa.mx)
✅ Qué instalar según cada escenario
| Escenario | ¿Qué instalar? |
|---|---|
| Cliente externo | Root + Intermedia + Server cert |
| Java (backend) | Root + Intermedia |
| Linux (curl/scripts) | Root + Intermedia |
| Angular/Navegador | Root + Intermedia |
| WebLogic | Root + Intermedia |
Regla de oro: Instala Root + Intermedia SIEMPRE. El Server cert solo instálalo si eres un cliente externo que no tiene forma de validar la cadena, pero usualmente no es necesario en el
cacerts.
❓ FAQ (Preguntas frecuentes)
¿Debo enviar mi llave privada a otro equipo?
NO. NUNCA. Solo envía los certificados públicos (
.crto.cer). La llave privada se queda en el servidor origen.
¿Por qué a veces con el navegador funciona y con Java no?
Porque los navegadores (Chrome/Edge) usan su propio almacén de certificados o el de Windows. Java usa su propio archivo
cacertsaislado.
¿Necesito importar el certificado del servidor (la hoja) en Java?
En general no. Si importas la Root y la Intermedia, Java validará automáticamente el certificado del servidor por la cadena de confianza.
¿Puedo usar .cer o .crt indistintamente?
Sí, generalmente ambos son archivos de texto (Base64/PEM). Lo importante es el contenido, no la extensión.
¿Qué significa unable to get local issuer certificate?
Significa que el sistema tiene el certificado del servidor, pero no encuentra quién lo firmó (falta la CA Intermedia o Root en el almacén).
¿Cómo valido la cadena con OpenSSL?
openssl verify -CAfile cadena-completa.pem server-vsotdcorerh.mi-empresa.mx.crt