Mensaje de error
No subject alternative names present
También se muestra como
- java.security.cert.CertificateException: No subject alternative names present
JDK 21 y posteriores anteponen «(certificate_unknown) » al texto de la excepción. Para nombres de host DNS, en Java un certificado sin SAN todavía puede coincidir a través del nombre común; otros clientes (Go, Chrome) rechazan directamente esos certificados.
Java (JSSE HostnameChecker) — certificate without a SAN extension, URL host is an IP address
Qué significa
El certificado del servidor no tiene ninguna extensión de nombre alternativo del sujeto, y el cliente se conectó por dirección IP. Para las direcciones IP, Java exige una entrada SAN de tipo IP y nunca recurre al nombre común, así que sin extensión SAN no hay nada con qué comparar. Es el resultado típico de certificados generados por scripts antiguos que solo ponen un CN.
Por qué ocurre
El certificado se creó sin subjectAltName
frecuenteopenssl req -x509 sin -addext subjectAltName, comandos antiguos de keytool sin -ext SAN o certificados generados por dispositivos dedicados.
La dirección IP se puso en el nombre común
frecuenteCN=10.0.0.5 parece correcto, pero se ignora al comparar direcciones IP; solo cuenta una entrada SAN de tipo IP.
Herramientas o plantillas de PKI heredadas
ocasionalLas plantillas de CA internas anteriores al requisito de SAN siguen emitiendo certificados solo con CN.
Cómo solucionarlo
- 1.
Confirmar que falta la extensión SAN
Imprime el sujeto y subjectAltName; si no aparece ningún SAN, hay que volver a emitir el certificado.
bash openssl x509 -in server.pem -noout -subject -ext subjectAltName # "No extensions in certificate" / no SAN output -> the certificate must be reissued - 2.
Volver a emitir el certificado con subjectAltName
Añade entradas DNS y, donde haga falta, IP; deja el CN solo para mostrarlo.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,IP:10.0.0.5" # keytool (Java keystores) keytool -genkeypair -alias server -keyalg EC -groupname secp256r1 -dname "CN=api.example.com" \ -ext "SAN=dns:api.example.com,ip:10.0.0.5" -keystore server.p12 -storepass changeit