miércoles, 8 de diciembre de 2021

Instalar certificado LetsEncrypt en Tomcat Ubuntu manual. Shell de actualización del certificado

 0. Introducción

Vamos a seguir a Mahdi Mashrur Matin a ver si esta vez sale bien. 

1. Prerequisitos

  • Tener privilegio de superusuario
  • Tener un dominio registrado ("webprop.es" en mi caso)
  • Versión de Java reciente instalada
  • Versión reciente de Tomcat instalada
  • Tener abiertos los puertos 80 y 8443 en el firewall
  • Tener instalado Openssl

2. Instalar Certbot

Tal como vimos en el fallido blog anterior, primero añadimos al repositorio

  • sudo add-apt-repository ppa:certbot/certbot

Instalamos el paquete Apache Certbot

  • sudo apt install python-certbot-apache


3. Genera keypair y el certificado sobre el dominio con Certbot.


En el fallido blog anterior, estos ficheros si que los tenemos (por tanto podemos saltar este paso). 

Para los que no hayais pasado por el blog anterior, debeis ejecutar:

sudo certbot certonly --standalone -d myweb.es

Y si toda ha ido bien, en el directorio /etc/letsencrypt/live/myweb.es (OJO: normalmente las direcciones suelen ser "csv.rocasdemar.es"  o algo por el estilo, siendo el directorio /etc/letsencrypt/live/csv.rocasdemar.es) Deben existir estos ficheros:
  • cert.pem (certificado "solo")
  • chain.pem (cadena de certificados del root)
  • fullchain.pem (certificado "solo" + cadena de certificados del root. Equivale a los 2 ficheros anteriores juntos)
  • privkey.pem (clave privada)
Si no utilizais LetsEncript, tenéis que realizar estos pasos:
=============================================================
1. Generar un par de clave privada y el CSR público (Certificate Signing Request) para el servidor web ("server"), con este comando

openssl req -nodes -newkey rsa:2048 -keyout domain.name.key -out domain.name.csr

2. Enviar el CSR al la entidad certificadora (CA) y ésta verificará tu dominio, y te suministrará un certificado (fichero .crt)  y cadena de certificados (certificate chain)
=============================================================

4. Configurar https en el puerto 19443 u otro de forma fácil (Opción recomendada)

Modificamos el conector en el fichero server.xml de la carpeta conf de tomcat y para el puerto 19443 para que quede así

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 <Connector port="19443"
     protocol="HTTP/1.1"
     SSLEnabled="true"
     maxThreads="150"
     scheme="https"
     secure="true"
     sslProtocol="TLS"

     clientAuth="true"
     keyAlias="tomcat"


     SSLCertificateFile="/etc/letsencrypt/live/midominio.es/cert.pem"
     SSLCertificateChainFile="/etc/letsencrypt/live/midominio.es/chain.pem"
     SSLCertificateKeyFile="/etc/letsencrypt/live/midominio.es/privkey.pem"
 />


5. Renovar el certificado en el servidor

Solo hace falta ejecutar el comando visto anteriormente, y ya está

sudo certbot certonly --standalone -d myweb.es

Si no funciona pues dice 
Problem binding to port 443: Could not bind to IPv4 or IPv6
Entonces hay que parar el servidor (./shutdown.sh) y ejecutar el comando anterio cambiando
 --standalone por --apache

sudo certbot certonly --apache -d myweb.es

PERO DA PROBLEMAS SI SE ACCEDE DESDE FUERA DE LA ORGANIZACION.


Lo mejor en estos casos es volver a instalar el cerbot, (paso 2)
Solo hay que reaarancar el Tomcat, para ello vamos al directorio "bin" del tomcat y ejecutamos

./shutdown.sh
./startup.sh

6. Configurar https en el puerto 8443 u otro con conversiones (NO RECOMENDADO)

El problema es que queremos utilizar el formato JKS, por tanto tenemos que realizar 2 conversiones

6.1. Convertir "keypair" + certificado a java keystore

1. Crear un PKCS12 que contenga la cadena de certrificados completa y la clave privada con openssl

openssl pkcs12 -export -out /tmp/webprop.es_fullchain_and_key.p12 \ -in /etc/letsencrypt/live/webprop.es/fullchain.pem \ -inkey /etc/letsencrypt/live/webprop.es/privkey.pem \ -name tomcat

2. Convertir el PVCS12 a JKS con keytool de java

keytool -importkeystore \ -deststorepass mi_password -destkeypass mi_password -destkeystore /tmp/webprop.es.jks \ -srckeystore /tmp/webprop.es_fullchain_and_key.p12 -srcstoretype PKCS12 -srcstorepass mi_password \ -alias tomcat


Donde hay que cambiar mi_password por la contraseña que querais

Si no utilizais LetsEncript, tenéis que realizar estos pasos:
=============================================================
1. Con el paso del punto anterior ya tienes la clave privada (fichero .key) y el certificado (fichero .cert) de la entidad certificadora. Se deberá generrar el fichero pfx, con este comando

openssl pkcs12-export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt

2. Convertir el fichero pfx a JKS

keytool-importkeystore -srckeystore webprop.pfx -srcstoretype pkcs12 \ -destkeystore webprop.jks -deststoretype JKS

=============================================================

6.2. Configurar Tomcat con el java keystore


Aseguratrse que esta sección de conf/server.xml está comentada 

<!--- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->

Y configurar el conector para que use el "shared thread pool" 

<Connector
executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

Ahora definir el conector SSL HTTP/1.1 En el puerto 8443

<Connector port="8443"
<!-- protocol="org.apache.coyote.http11.Http11Protocol"-->
protocol="HTTP/1.1"
maxThreads="150" cd ..
SSLEnabled="true"
scheme="https"
secure="true" keystoreFile="/tmp/webprop.es.jks" keystorePass="mi_password" clientAuth="false"
sslProtocol="TLS" />

NOTA: He tenido que comentar la línea:
 "<!-- protocol="org.apache.coyote.http11.Http11Protocol"-->
y cambiarla por la línea de rojo (protocol="HTTP/1.1") pues no me funcionaba.

Ahora hay que rearrancar el Tomcat y debería funcionar. Aunque a mi me ha tardado mucho en arrancar!!


6.3. Crear un shell scrypt para renovar el certificado.

Para ello debemos tener los siguientes prerequisitos:
  • Tener privilegio de superusuario
  • Tener un dominio registrado ("webprop.es" en mi caso)
  • Versión de Java reciente instalada
  • Versión reciente de Tomcat instalada
  • Tener abiertos los puertos 80 y 8443 en el firewall
  • Tener instalado Openssl
  • Tener configurado Tomcat para el puerto 8443 tal como hemos visto en el punto anterior
Veamos el bash

#!/bin/bash

#--Explicació
#---------------------------------------------------------------------------
# S'ha d'executar des de la màquina que s'ha d'instal·lar el certificat 
# Ha d'estar instal·lat el cerbot a la màquina:
#    sudo add-apt-repository ppa:certbot/certbot
#    sudo apt install python-certbot-apache

# La carpeta /etc/letsencrypt/live/csv.tavernesvalldigna.es/ ha de tindre 
#   permissos d'escritura per a eviar cridar-la amb "sudo" 
#   per tant cal executar abans esta orden:    
#     sudo chmod -R ugo+rwx /etc/letsencrypt
#     sudo chmod -R ugo+rwx /var/log
#     sudo chmod -R ugo+rwx /var/lib/letsencrypt

# 1. Indicar el domini
# 2. Indicarla carpeta on guarda el certbot els certificats
# 3. Indicar la carpeta on guardar els certificats tipus jks
#    que és la ruta on Tomcat els busca
# 4. Indicar la paraula de pas del certificat
#---------------------------------------------------------------------------

#--Parameters
myuser='ximo'
domain='webprop.es'
download_certbot='/etc/letsencrypt/live/'${domain}
keystore_folder='/home/'${myuser}'/MyKeystores'
psswrd='mi_password'

work_folder=${keystore_folder}'/letsencrypt/'$(date +%Y.%m.%d)
ks_prefix=${work_folder}'/'${domain}
JAVA_HOME='/home/'${myuser}'/MyPrograms/jdk-15.0.2+7.OpenJ7'

echo '--------------------------------------------------------------'
echo 'Usuari:           ' $myuser
echo 'Domain:           ' $domain
echo 'Descarga Certbot: ' $download_certbot
echo 'Keystore folder:  ' $keystore_folder
echo 'Paraula de pas :  ' $psswrd
echo 'Work folder :     ' $work_folder
echo 'Keystore prefix : ' $ks_prefix
echo 'JAVA_HOME :       ' $JAVA_HOME
echo '--------------------------------------------------------------'

certbot certificates

echo '--------------------------------------------------------------'
echo Por favor, verificar que los datos son correctos
read continuar

# No se si vol "csv.tavernesvalldigna.es" o si "vol sols tavernesvalldigna.es"
# Descarreguem  el certificat a /etc/letsencrypt/live/csv.tavernesvalldigna.es/ 
certbot certonly --standalone -d ${domain}

echo Creem la carpeta ${work_folder}
mkdir -p ${work_folder}
 
echo Convertir el p12 i el pem a PKCS12 
openssl pkcs12 -export -out ${ks_prefix}'_fullchain_and_key.p12' -in ${download_certbot}'/fullchain.pem' -inkey ${download_certbot}'/privkey.pem' -password pass:${psswrd} -name 'tomcat'


echo Convertir el PKCS12 a JKS 
$(${JAVA_HOME}'/bin/keytool' -importkeystore -deststorepass ${psswrd} -destkeypass ${psswrd} -destkeystore ${ks_prefix}'.jks' -srckeystore ${ks_prefix}'_fullchain_and_key.p12'  -srcstoretype PKCS12 -srcstorepass ${psswrd} -alias 'tomcat')

echo Copiar a la carpeta MyKeystore 
cp ${ks_prefix}'.jks' ${keystore_folder} 



No hay comentarios :

Publicar un comentario