es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    1. Descargue el certificado raíz de Let’s Encrypt (https://letsencrypt.org/certs/isrgrootx1.pem).
    2. Cree un nuevo almacén de confianza (por ejemplo, truststore.p12) con el certificado raíz:
      keytool -import -alias letsencrypt-isrg-root-x1 -keystore truststore.p12 -storetype pkcs12 -file isrgrootx1.pem
      
    3. Actualice la configuración de su aplicación Spring Boot para utilizar el nuevo almacén de confianza:
      server.ssl.key-store-type=pkcs12
      server.ssl.key-store=classpath:keystore.p12
      server.ssl.key-store-password=<your-keystore-password>
      server.ssl.trust-store-type=pkcs12
      server.ssl.trust-store=classpath:truststore.p12
      server.ssl.trust-store-password=<your-truststore-password>
      

      Tenga en cuenta que se han agregado las propiedades server.ssl.trust-store-type y server.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.

Comments are closed.