Instala un Certificado Let´s Encrypt en Tomcat

le-logo-twitterHace poco descubrí la existencia de Let´s Encrypt. Se trata de una autoridad de certificación gratuita, automatizada y abierta. Esto significa que podrás descargar un certificado completamente válido y funcional totalmente gratuito.

Al parecer, el propósito de este proyecto no es otro que ir haciendo desaparecer el protocolo http en favor el https, bastante más seguro. Detrás de esta iniciativa están grandes compañías como Cisco, Mozilla, Chrome, HP, Facebook, Microsoft (esta última era una broma irónica).

Para ello Let´s Encrypt hace uso del protocolo ACME (quizá os suene de los Looney Tunes), aunque en realidad sus siglas corresponden a Automatic Certificate Management Environment (ACME).  Podéis leer más sobre su funcionamiento en el siguiente enlace: https://letsencrypt.github.io/acme-spec/

Existen muchos clientes ACME, en mi caso he elegido CertBot que es el que recomiendan desde Let´s Encrypt. El cliente CertBot es bastante sencillo de usar, además tienen plugins para distintos tipos de software como Apache, Nginx, Haproxy o Plesk en distintos sistemas operativos, casi todos basados en Unix (Linux en sus diferentes distros, Mac Osx …).

Como vereis no existe un plugin para Tomcat, así que toca batallar un poco.

Así pues, lo primero que haremos es descargarnos CertBot y dar permisos al archivo descargado:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

captura

Ejecutamos…

./certbot-auto

captura2

captura3

Ahora nos avisa de que no ha podido configurarse automáticamente, pero que podemos obtener el certificado y configurarlo manualmente mediante el comando:

./certbot-auto certonly

captura4

captura5

Contestamos según nos interese.

captura6

Nos pide un email para noticias urgentes o si pierdes la clave, lo tecleamos:

captura7

Aceptamos los términos del servicio. Agree

captura8

Elegimos el dominio o los dominios para nuestro certificado.

captura9

Et voilà (ya tenemos descargado nuestro certificado), nos indica también donde lo ha alojado:

captura10

Copiamos los archivos a nuestro directorio de tomcat para poder manipularlos.

captura11

Ahora tendremos que crear un almacén de claves de Java (KeyStore) para añadir nuestro certificado, y así que tomcat pueda hacer uso del mismo.

Es necesario añadir el privkey.pem al JKS, mediante openSSL lo podemos hacer de la siguiente manera:

openssl pkcs12 -export -in cert.pem -inkey privkey.pem -out cert_and_key.p12 -name tomcat -CAfile chain.pem -caname root

Es recomendable anotar bien el Password, lo vamos a necesitar.

Convertimos el pkcs12 a jks

keytool -importkeystore -deststorepass  -destkeypass  -destkeystore MyDSKeyStore.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -srcstorepass  -alias tomcat

Ahora tenemos que añadir nuestro chain.pem al nuestro almacen de claves:

keytool -import -trustcacerts -alias root -file chain.pem -keystore MyDSKeyStore.jks

captura14

Hasta aquí todo correcto, ahora tendremos que hacer algunos cambios en el server.xml:

Con nuestro editor favorito (en mi caso nano), abrimos el archivo server.xml y editamos lo siguiente:

nano server.xml

80

443

Si además queremos forzar https en la aplicación, algo muy recomendable, iremos al directorio de nuestra aplicación /WEB-INF/web.xml y añadiremos el siguiente código:

<!– Require HTTPS for everything except /img (favicon) and /css. –>
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOrHTTP</web-resource-name>
<url-pattern>*.ico</url-pattern>
<url-pattern>/img/*</url-pattern>
<url-pattern>/css/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>

 

Una vez realizados estos cambios reiniciamos nuestro tomcat y vemos que accedemos de forma segura. Al fin tendremos nuestro candadito verde válido:

secure

captura16captura17

Espero que os sirva de ayuda.

NOTA: Los certificados que emite Let´s Encrypt tienen una validez de 90 días. Renovarlos es sencillo, cuando me toque haré otro post indicando los pasos.

Autor: Jorge Bastida Cano

Programador de Software y Apasionado de las nuevas tecnologías.

23 opiniones en “Instala un Certificado Let´s Encrypt en Tomcat”

  1. Hola Jorge cómo estas? te comento que estuve siguiendo este tutorial, Pero no pude hacer funcionar la conexión segura, y ahora tampoco puedo levantar una conexión no segura. Estuve probando varias cosas sin éxito, Tengo un tomcat 7.4 que ya vino con un liferay. seguí todos los pasos pero ahora al entrar a mi pagina solamente veo en blanco. Mi configuración antigua del server.xml era la siguiente:

    Muy básica, ya que yo no conozco mucho de servidores! pero bueno estaba funcionando. Ahora lo dejé así:

    Y la verdad que no puedo hacer que levante mi sitio. No se que hice mal la verdad, en mi cloud hosting tengo abiertos los puertos, entre ellos el 443. Alguna idea de que puede estar pasando?

  2. uh, creo que me elimino las lineas donde te muestro la configuración. Voy a probar sin las etiquetas: Mi configuración antigua:
    Connector port=»80″ protocol=»HTTP/1.1″
    connectionTimeout=»20000″
    redirectPort=»8443″
    Connector port=»8009″ protocol=»AJP/1.3″ redirectPort=»8443″
    y la de ahora:
    Connector port=»80″ protocol=»HTTP/1.1″
    connectionTimeout=»20000″
    URIEncoding=»UTF-8″
    redirectPort=»443″

    Connector port=»443″ protocol=»org.apache.coyote.http11.Http11Protocol»
    axThreads=»150″ SSLEnabled=»true» scheme=»https» secure=»true»
    clientAuth=»false» sslProtocol=»TLS»
    keystoreFile=»conf/MyDSKeyStore.jks» keystorePass=»***»
    keyAlias=»tomcat» keyPass=»***»

    Espero que ahora si se vea.

    1. Buenos días Cristian, acabo de ver tu comentario. No sé si has conseguido solucionar el problema, si no lo has hecho vamos a ver si lo podemos solucionar. Necesitaría ver la salida del fichero catalina.out para comprobar que tomcat está levantado y poder comprobar los logs del mismo. Un saludo

      1. Muchas gracias por tu respuesta, te comento que sigo con el problema, al parecer no está levantando, o no estoy muy seguro. Te dejo el log. de la fecha de hoy:

        https://docs.google.com/document/d/1FSTDmvmk_eq9iGcLmM_dfa1fXJ-Od4DKnAvlxbWq0nY/edit?usp=sharing

        Lo pongo en un documento de drive porque es muy largo.

        Por lo que estuve leyendo encontré que hay otra cosa que está ocupando el puerto, pero la verdad no sé que será. Al instalar ./certbot-auto me pidio instalar varias cosas mas, como python 3 y demás, mañana voy a seguir, y si encuentro algo lo comento. Un saludo y muchas gracias!

  3. buen día Jorge realizo el procedimiento que explicas y al llegar al paso
    «keytool -import -trustcacerts -alias root -file chain.pem -keystore MyDSKeyStore.jks»
    de entrada una duda: después de -alias va root? o el alias que yo elegí?
    aun si lo pruebo de una u otra manera me marca el siguiente error:
    error de herramienta de claves: java.io.IOException: Keystore was tampered with, or password was incorrect

    cuando solicita la contraseña del almacen le pongo la de default pero no eh podido avanzar en este punto.

    Saludos

      1. Hola Jorge Bastida Cano!
        Yo tengo el mismo problema no puedo que Cristina al ejecutar el keytool – import -trustcacerts….
        Introduzco la contraseña
        y me envia este mensaje
        error de herramienta de claves: java.io.IOException: Keystore was tampered with, or password was incorrect

    1. Para los que teneis el problema con «Keystore was tampered with, or password was incorrect» El problema está en el paso de «Convertimos el pkcs12 a jks» hay que introducir la contraseña del keystore, la contraseña estará a continuación de «-deststorepass» y eliminando «-destkeypass» por lo que quedaria asi:

      keytool -importkeystore -deststorepass *contraseña* -destkeystore MyDSKeyStore.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -srcstorepass -alias tomcat

      Esta contraseña se pondrá en el último paso al meterlo en el keystore y ya funciona. Un saludo

  4. Estimado, antes que todo quiciera agradecerte el tutorial ya que si no fuese por este tipo de aportes, no tendría idea de como hacerlo ni de donde empezar jeje.

    Realicé todo el procedimiento (excepto el redireccionamiento automático a https ya que mi sitio es un .war y no tiene carpetas) y no tengo ningún problema ni error generado pero no consigo acceder al servidor mediante el dominio, antes de cambiar el archivo server.xml podía ingresar mediante el puerto 8080 al sitio principal de tomcat, pero al hacer el cambio al puerto 80 en un conector y en otro 443 no puedo acceder de ninguna manera, ni con http, ni https ni http con puerto 80, 443 o viceversa, es decir totalmente inaccesible, tengo desactivado el firewall ufw mientras para asegurarmen de que no era el problema. Tienes alguna idea de cual podría ser el problema estimado? he estado batallando bastante, esla 3era vez que formateo el servidor pensando que el causante eran otros servidores como nginx y apache y que al desabilitarlos dejaban «algo» colgado que impedía el acceso, pero ahora instalado ubuntu 18.04 nuevo, solo con lo que aparece en el tutorial y el servidor tomcat por lo que no era lo que pensaba 🙁

    1. Hola Fernando, qué tal?
      Estuve unos días de vacaciones y acabo de ver tu comentario… Me gustaría saber si al final has conseguido tu objetivo.
      Saludos.

  5. Buenas jorge!

    Antes de nada, gracias por el post, me está ayudando bastante con la implementación de un certificado. Me da error en el comando «keytool -importkeystore -deststorepass -destkeypass -destkeystore MyDSKeyStore.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -srcstorepass -alias tomcat»

    Me indica lo siguiente:
    Illegal option: tomcat
    keytool – importkeystore [OPTION]…

    Es CentOS con Liferay, he generado los certificados correctamente.
    Un saludo!

    1. Hola J.Luis,

      Gracias por tu comentario y disculpa la demora. ¿has podido solucionar el problema?.
      Me da la impresión que no estás poniendo el pass en la cadena del comando. Coméntame a ver si te puedo echar una mano.

      Saludos.

      1. Buenas Jorge,

        Así es, me faltaba por verificar esta parte. Ahora me salta el mismo error que los compañeros de arriba, al ejecutar el comando me salta el siguiente mensaje:

        keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect

        Un saludo,
        Muchas gracias por la ayuda.

    2. En el comando te ha faltado la contraseña.
      Cuando pones -srcstorepass * -alias tomcat
      tienes que poner la contraseña que pusiste en el paso anterior en lugar de *

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.