Tengo unos certificados emitidos por la FNMT para hacer peticiones al web service del ministerio para peticiones soivre. He importado dichos certificados en formato .cer al fichero cacerts mediante la herramienta keytool pero cuando lanzo la aplicación java siempre me muestra el mismo error:
main, READ: TLSv1 Application Data, length = 4257
main, received EOFException: ignored
main, called closeInternal(false)
main, SEND TLSv1 ALERT: warning, description = close_notify
main, WRITE: TLSv1 Alert, length = 18
main, called close()
main, called closeInternal(true)
Lanzándome la excepción: (403)Forbidden
Me huele que sea problema de cómo estoy importando los certificados con el keytool en el keystore y el truststore pero no encuentro información acerca del tema y no estoy seguro de nada!!
Agradecería cualquier información!!
Un saludo y gracias!!
Con certificados FNMT y peticiones a servicios de la administración (como el de SOIVRE) los problemas más habituales al importar con keytool vienen de dos sitios: el formato del certificado y dónde exactamente se importa.
Un par de cosas a revisar:
1. Formato correcto antes de importar. Si el certificado que te dio la FNMT viene en .cer pero en realidad es un certificado con clave privada (típico si te lo dieron como .pfx/.p12 convertido), necesitas importarlo como entrada de clave privada, no como certificado de confianza suelto. Con .p12 el import correcto sería directo al keystore con:
keytool -importkeystore -srckeystore tu_certificado.p12 -srcstoretype PKCS12 -destkeystore cacerts -deststoretype JKS
Si en cambio solo importas el .cer público con -importcert a cacerts, estás diciéndole a Java "confía en este certificado" pero no le estás dando la clave privada que necesitas para autenticarte tú mismo contra el servicio (que suele exigir TLS mutuo con certificado de cliente, no solo verificar el del servidor).
2. Confirma qué está fallando exactamente: si el error es de validación del certificado del servidor del ministerio (necesitas confiar en su CA), va en cacerts. Si el error es de autenticación (el servicio te pide identificarte con tu propio certificado FNMT), necesitas configurar tu aplicación con un keystore de cliente distinto del truststore, y tu framework HTTP (Apache HttpClient, java.net, lo que estés usando) tiene que apuntar explícitamente a ese keystore de cliente para las peticiones salientes, no basta con tenerlo en cacerts.
Si me dices el mensaje de error exacto que te da al lanzar la petición, puedo afinar más sobre cuál de los dos casos es el tuyo.
Lucia