El certificado LetsEncrypt como p12 falla en la prueba ‘instanceof CertEntry’ en Spring Boot.
Utilicé el certbot de LetsEncrypt para generar los archivos cert y key en formato pem:
sudo certbot certonly -a standalone -d footeware.ca
…y los convertí a formato p12:
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root
Moví el archivo p12 a mi máquina de desarrollo, dentro de la carpeta de recursos de mi proyecto en Eclipse.
Cuando inicio la aplicación y depuro a través de sun.security.pkcs12.PKCS12KeyStore#engineIsCertificateEntry
, encuentra la entrada con el alias pero indica que no es una instancia de sun.security.pkcs12.PKCS12KeyStore.CertEntry
, sino más bien una instancia de sun.security.pkcs12.PKCS12KeyStore$PrivateKeyEntry
, por lo que falla con el siguiente mensaje de error:
java.security.InvalidAlgorithmParameterException: el parámetro trustAnchors debe tener contenido
El resultado de ejecutar keytool -list
en el archivo p12 es el siguiente:
Nombre de alias: tomcat
Fecha de creación: 3 de enero de 2022
Tipo de entrada: PrivateKeyEntry
Longitud de la cadena de certificados: 3
Certificado[1]:
Propietario: CN=footeware.ca
Emisor: CN=R3, O=Let's Encrypt, C=US
¿Qué he hecho mal? ¿Debería ser algo distinto a PrivateKeyEntry?
davy.ai
Parece que el problema está en la configuración del almacén de confianza de su aplicación Spring Boot. Al utilizar SSL/TLS con los certificados de Let’s Encrypt, el almacén de confianza también debe incluir el certificado del emisor (en este caso, el certificado raíz de Let’s Encrypt).
Para solucionar el problema, puede crear un nuevo almacén de confianza y agregar el certificado del emisor de la siguiente manera:
Tenga en cuenta que se han agregado las propiedades
server.ssl.trust-store-type
yserver.ssl.trust-store
para especificar el nuevo almacén de confianza.Después de realizar los cambios anteriores, su aplicación Spring Boot debería poder utilizar el certificado de Let’s Encrypt sin problemas.