Hace 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
Ejecutamos…
./certbot-auto
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
Contestamos según nos interese.
Nos pide un email para noticias urgentes o si pierdes la clave, lo tecleamos:
Aceptamos los términos del servicio. Agree
Elegimos el dominio o los dominios para nuestro certificado.
Et voilà (ya tenemos descargado nuestro certificado), nos indica también donde lo ha alojado:
Copiamos los archivos a nuestro directorio de tomcat para poder manipularlos.
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
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
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:
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.
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?
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.
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
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!
Hola Cristian, ¿cómo lo llevas? ¿has conseguido solucionar el problema?
Un saludo
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
Hola Cristina, disculpa la demora ¿has conseguido instalarlo? Si no lo has conseguido prueba a realizar los comandos con permisos de root. Ya me dices. Saludos.
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
Hola Claudia,
Entiendo que verificas que la contraseña es correcta ¿no? Coméntame y vamos avanzando.
Saludos.
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
Gracias por el aporte Luis.
Saludos.
Así es Jorge, la contraseña que escribo es la misma, sin embargo me indica ese error.
Me ha funcionado perfecto, muchas gracias por tu aporte!
Hola Javier,
Me alegra saber que te he ayudado. Un saludo.
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 🙁
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.
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!
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.
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.
Buenas J.Luis
Tiene pinta de que los password que estás introduciendo no son los correctos… ¿es posible?
Un saludo.
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 *
Efectivamente, así es Luis Manrique.
¡Gracias!