Instalar certificado gratuito ssl con Let’s Encrypt en tomcat

Es comun utilizar Let’s Encrypt par poner certificados gratuitos seguros en nuestros dominios, ponerlos en apache o nginx es una tarea sencilla, pero todos hemos sufrido la tarea de poner un certificado seguro en un llavero (Java KeyStore) de tomcat.

Con esta pequeña entrada voy a explicar paso a paso como poner un certificado gratuito Let’s Encrypt en tomcat.

Para realizar los pasos necesitaremos tener instalado en el sistema keytool (viene con el jdk) y certboot (https://certbot.eff.org/).

Creamos un llavero JKS (letsencrypt.jks) con una clave RSA 2048, con la entrada de dominio (midominio.es)

keytool -genkeypair -alias simple-cert -keyalg RSA -keysize 2048 -keystore letsencrypt.jks -dname "CN=midominio.es" -storepass password12345

Agregamos una segunda clave RSA 4096 – (san-cert)

keytool -genkeypair -alias san-cert -keyalg RSA -keysize 4096 -keystore letsencrypt.jks -dname "CN=midominio.es" -storepass password12345

Creamos un CSR para simple-cert y un CSR para san-cert

keytool -certreq -alias simple-cert -keystore letsencrypt.jks -file midominio.csr -storepass password12345 -ext san=dns:midominio.es

Creamos el full certificate chain con certboot (certificado Let’s Encrypt).

certbot certonly --manual --csr midominio.csr --preferred-challenges "dns"

Nos creara una serie de certificados y debemos de quedarnos con el full certificate chain.

Successfully received certificate.

Certificate is saved at:            C:\Program Files (x86)\Certbot\bin\0000_cert.pem
Intermediate CA chain is saved at:  C:\Program Files (x86)\Certbot\bin\0000_chain.pem
Full certificate chain is saved at: C:\Program Files (x86)\Certbot\bin\0001_chain.pem
This certificate expires on 2023-03-07.

Añadimos el certificado al keystore (clic YES cuando pregunte).

keytool -importcert -alias simple-cert -keystore letsencrypt.jks -storepass password12345 -file 0001_chain.pem

Y ya tendriamos el certifiado creado y solo necesitariamos añadirlo en el fichero de configuración del tomcat (server.xml).

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true" URIEncoding="UTF-8"
keystoreFile="conf\ssl\letsencrypt.jks"
keystorePass="password12345" keyAlias="simple-cert"
clientAuth="false" sslProtocol="TLS" />

—- RENOVAR CERTIFICADO —-

Los certificados Let’s Encrypt , caducan a los tres meses, con lo que es posible que al intentar reniovarlo nos de problemas, lo unico que tendremos es que realizar los mismos pasos y cuando lancemoz el comando certbot, crear la entrada dns que nos pidan por consola.

Please deploy a DNS TXT record under the name:

_acme-challenge.midominio.es.

with the following value:

t8TpRgmScIuzwwrXgsCEhqt1VaV4s7EkxEziWoOCJ2h

Crear servicio para jetty en centos 7

Con la llegada de centos 7 se termino con el sistema clasico de servicios utilizando init.d y se cambio por servicios configurables con systemd

Voy a explicar a crear un servicio para un instalación de jetty desde codigo fuente como vimos en las entradas instalar-servidor-jetty-en-linux-desde-codigo-fuente y habilitar-https-en-jetty-con-certificado-autofirmado

Crearemos un fichero en la ruta /etc/systemd/system/jetty.service donde introduciremos como arrancar y parar el servicio.

vi /etc/systemd/system/jetty.service

Description=Jetty Web Application Server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/jetty/jetty.pid
ExecStart=/usr/local/jetty-distribution-9.4.24.v20191120/bin/jetty.sh start
ExecStop=/usr/local/jetty-distribution-9.4.24.v20191120/bin/jetty.sh stop
User=root

[Install]
WantedBy=multi-user.target

Una vez guardado el fichero lo que haremos sera recargar los demonios, arrancar el jetty y establecer el servicio y de esta manera ya tendremos el jetty arancada en cada encendido del servidor.

systemctl daemon-reload
systemctl start jetty.service
systemctl enable jetty

Habilitar https en jetty con certificado autofirmado

En la entrada instalar-servidor-jetty-en-linux-desde-codigo-fuente vimos como instalar jetty desde codigo fuente, hoy voy a explicar como habilitar el protocolo https con un certificado autofirmado.

Creamos y entramos en el directorio donde generaremos el certificado.

mkdir /usr/local/jetty-distribution-9.4.24.v20191120/ssl 
cd /usr/local/jetty-distribution-9.4.24.v20191120/ssl

Generamos la calve privada con OpenSSL con la contraseña “jetty9” (se puede utilizar la que se desee).

openssl genrsa -aes128 -out jetty.key

Generamos un certificado para la clave privada en el archivo jetty.crt (utilizando la misma contraseña y los valores que queramos).

 openssl req -new -x509 -newkey rsa:2048 -sha256 -key jetty.key -out jetty.crt

Creamos un llavero con las calves en el formato PKCS12:

 openssl pkcs12 -inkey jetty.key -in jetty.crt -export -out jetty.pkcs12

Ahora configuramos el fichero ssl.ini con las  variables del puerto, llavero y contraseñas para que jetty utilice nuestro certificado:

vim /usr/local/jetty-distribution-9.4.24.v20191120/start.d/ssl.ini
jetty.ssl.port=443
jetty.sslContext.keyStorePath=ssl/jetty.pkcs12
jetty.sslContext.keyStorePassword=jetty9
jetty.sslContext.keyManagerPassword=jetty9

Y ya podemos arrancar el jetty y verl el certificado https  en funcionamiento.

/usr/local/jetty-distribution-9.4.24.v20191120/bin/jetty.sh start
Certificado autofirmado en jetty9

En la siguiente entrada explico como crear un servicio en el arranque para centos 7 crear-servicio-para-jetty-en-centos-7

Instalar servidor jetty en linux desde código fuente

En muchas ocasiones queremos utilizar servidores ligeros y fáciles de administrar, pues para servir aplicaciones en java uno de los mejores es jetty.

Voy a explicar como ponerlos funcionamiento desde cualquier distribución de Linux (centos, red hat, Ubuntu, debian …)

Para poner en marcha el servidor de aplicaciones jetty necesitamos tener el Java Development Kit para (jdk), para servir aplicaciones hechas en java.

Para ello vamos a utilizar las versiones libres del jdk y lo descargaremos desde aquí: https://jdk.java.net/

Para el ejemplo voy a utilizar la versión: openjdk-13.0.1

Nos dirigimos al directorio /usr/local descargamos y descomprimimos:

cd /usr/local/
wget https://download.java.net/java/GA/jdk13.0.1/cec27d702aa74d5a8630c65ae61e4305/9/GPL/openjdk-13.0.1_linux-x64_bin.tar.gztar 
tar –xjvf openjdk-13.0.1_linux-x64_bin.tar.gz

Comprobamos que funciona.

/usr/local/jdk-13.0.1/bin/java -version
openjdk version "13.0.1" 2019-10-15
OpenJDK Runtime Environment (build 13.0.1+9)
OpenJDK 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing---------------------------
jetty 9.4.12 

Ahora que ya tenemos el jdk funcionando lo siguiente en descargarnos y descomprimir la versión de jetty que queramos:

Para el ejemplo voy a utilizar la versión: jetty-distribution-9.4.24

wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.24.v20191120/jetty-distribution-9.4.24.v20191120.tar.gz
tar -xzvf jetty-distribution-9.4.24.v20191120.tar.gz

Ahora lo siguiente que haremos es añadir la ruta del jdk para que la utilice el jetty al arrancar.

vi /usr/local/jetty-distribution-9.4.24.v20191120/bin/jetty.sh

JAVA="/usr/local/jdk-13.0.1/bin/java"

Lo siguiente que haremos es configurar el jetty para que sirva por el puerto 80

vi /usr/local/jetty-distribution-9.4.24.v20191120/start.ini

jetty.http.port=80

Y ya podemos arrancar el jetty y verlo en funcionamiento, arrancando con el siguiente comando:

/usr/local/jetty-distribution-9.4.24.v20191120/bin/jetty.sh start

jetty 9 en funcionamiento

En las siguientes entradas explico como utilizar el protocolo https con un certificado autofirmado habilitar-https-en-jetty-con-certificado-autofirmado y como crear un servicio en el arranque para centos 7 crear-servicio-para-jetty-en-centos-7