miércoles, 8 de diciembre de 2021

Instalar Tomcat en Ubuntu 18 (1) (Version correcta. OJO con DNS). Contraseñas NO ASCII en XML, conversión de certificados a JKS

1. Prerequisitos

1. Descargar el OpenJDK (15 ó 17 segun version de tomcat) desde el repositorio 

2. Descomprimir el fichero zip o tar segun disponibilidad en una carpeta como MisProgramas

3. Descargamos el fichero "zip" de la versión 9 desde el repositorio de Tomcat.

4. Descomprimimos el fichero en una carpeta como MisProgramas


2. Crear archivo setenv.sh (carpeta bin)

En la carpeta bin, se crea este archivo (en windows será setenv.bat "supongo"). 

Aquí le indicamos de manera opcional:
  • La ruta de JAVA (En Tomcat 10, se prefiere Java 17 o superior!)
  • Los parámetros de memória etc 
Veamos el contenido para tomcat 9:

export JAVA_HOME=/home/ximo/MyPrograms/jdk-15.0.2+7.OpenJ7
#export CATALINA_OPTS="$CATALINA_OPTS -Xms4M -Xmx6G -Xss1M"


Para tomcat 10:

export JAVA_HOME=/home/ximo/MyPrograms/jdk-17.0.2+9.OpenJ9
#export CATALINA_OPTS="$CATALINA_OPTS -Xms4M -Xmx6G -Xss1M"

3. Ajustar archivos de configuración

1. tomcat-users.xml (carpeta conf)

Hay que activar al menos el usuario tomcat con al menos el rol "manager-gui"

<role rolename="tomcat"/>
<role rolename="manager-gui"/>

<user username="tomcat" password="mypassword" roles="tomcat,manager-gui"/>

2. context.xml (carpetas :conf, webapps/aplicacion(1..n)/META-INF)

Ojo, para cada aplicación descargada en la carpeta webapps, dentro de la subcarpeta específica META-INF hay un fichero context.xml que define las IPs de acceso a cada aplicación. Por tanto si queremos accedert a manager y host-manager hay que comentar la etiqueta <Valve .../> 

<Context antiResourceLocking="false" privileged="true" >
  <!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
</Context>

Otra opción mejor es añadir la IP de la máquina que queremos que pueda entrar en la aplicacion. Por ejemplo para que esta IP 192.168.0.1 pueda entrar quedaría

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="192.168.0.1|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
</Context>

3. server.xml (carpeta conf)

Si queremos activar el protocolo "https", debemos conseguir un certificado y actuar como se indica en una entrada anterior o si se utiliza LetsEncrypt, esta otra.

Para poder crear puertos adicionales como el 8081 basta con crear otra entrada como esta

<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

En cambio para habilitar el puerto 80 .. puede haber problemas. 

Introducir en el navegador de otra máquina http//:IP_Servidor:80 (siendo IP_Servidor la IP de la máquina donde hemos instalado el Tomcat) a ver si no nos niega el acceso. 

Si nos niega el acceso, hay que borrar los cookies (galletas, galetes ..) del navegador y volver a probar. Pero para salir de dudas de los navegadores, lo mejor es ejecutar en el servidor local por línea de comandos:

curl http://localhost:80

Si sale una ratahila de código html, estamos de suerte. Si por el contrario hay un error, muestra un código parecido

curl: (7) Failed to connect to localhost port 80: Connection refused

A continuación se prueba desde otra máquina a ver si va (puede haber problemass con el fichero  context.xml, que lo hemos visto en el punto anterior y su posible solución en la etiqueta <Valve.../>) Probamos desde otra máquina con línea de comandos 

curl http://IP_Servidor:80

4. Si no hay manera de arrancar el puerto 80

Esta parte es la más peliaguda, pues no se si la estoy haciendo bien o no. 
Se debe comprobar que exista la carpeta /etc/apache2 con esta estructura de carpetas

/etc/apache2/
├── conf-available
├── conf-enabled
├── mods-available
├── mods-enabled
├── sites-available
└── sites-enabled

En el caso que no exista o que se sospeche que se ha modificado inadecuadamente por algún programa (por ejemplo el Certbot para instalar el certificado LetsEncrypt), se deberá desinstalar el apache2 y volverlo a instalar (ver la respuesta de JudRoman)

Para ello ejecutamos estos comando para devolver el fichero de apache2.conf a su estado inicial.

sudo apt-get purge apache2

sudo apt-get install apache2

Se rearranca el tomcat y mejor si reaarancamos el servidor y verificar que tomcat esté corriendo con

ps -ef | grep tomcat

y si el servicio está arrancado, pproprobamos con

curl http://localhost:80

a ver si va. Si no va, hasta aquí llego!

5. Configurar https

5.1 Definir el dominio.

A pesar que en linux está el fichero /etc/host que nos sirve para dar un alias (solo aplicable al ordenador que estemos trabajando y por tanto el que tiene el /etc/host), el nombre de dominio se debe dar de alta en el servidor DNS del dominio donde estemos. En general el servidor de DNS será una máquina Windows a la que habrá que pedir al administrador de dicha máquina que le asigne el dominio a esa máquina. Por ejemplo al la IP 192.192.1.25 le asigna el nombre de dominio csv.villaximo.es

Para ello conviene tener un certificado a ser posible emitido por una entidad certificadora (ACCV, LetsEncrypt, ..). 
Se parte de un certificado en formato ".jks" (Java Keystore), junto con una contraseña.
En caso que no se tenga, o se tenga en otros formatos consultar estos posts:

Consultar esta web para ver como se configura ssh con certificados ".pem "(p12)

Veamos 2 ejemplos de configuración de certificados (uno para el puerto 8443 y el otro para el 19443) Se ha copiado del 2ª enlace

5.2a con certificado jks (tomcat 10)

Supongamos que tenemos un certificado p12 llamado mykeystore.jks con contraseña "mypassword", entonces:

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<!-- Define a SSL HTTP/1.1 Connector on port 8443
        This connector uses the JSSE configuration, when using APR, the
        connector should be using the OpenSSL style configuration
        described in the APR documentation -->
    <Connector port="8443" 
              protocol="HTTP/1.1"
              SSLEnabled="true"
              maxThreads="150" 
              scheme="https" 
              secure="true"
              clientAuth="false" <!-- true to read client certificate -->
              sslProtocol="TLS" <!--"TLSv1.2" -->
              keyAlias="tomcat"
	      keystoreFile="/home/ximo/mykeystore.jks"
	      keystorePass="mypassword" 
              
    /> 

Para tomcat 10 tenemos



<!-- Define a SSL HTTP/1.1 Connector on port 8443
        This connector uses the JSSE configuration, when using APR, the
        connector should be using the OpenSSL style configuration
        described in the APR documentation -->
    <Connector port="8443" 
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               SSLEnabled="true"
               maxThreads="150" 
               <SSLHostConfig certificateVerification="require">
                 <Certificate
                   certificateKeyAlias="tomcat"
                   certificateKeystoreFile="/home/ximo/mykeystore.jks"
certificateKeystorePassword="mypassword"
type="RSA" /> </SSLHostConfig> </Connector>



Si queremos pedir que el cliente se autentique con certificado, debemos activar la configuración clientAuth="true" en tomcat 9, pero en tomcat 10 <SSLHostConfig certificateVerification="require">
Y ahora vamos al directorio "bin" del tomcat y paramos y rearrancamos el servicio

./shutdown.sh
./startup.sh

NOTA 1: Conversión de p12 a JKS

Y si queremos obtener un certificado "jks" a partir de un certificado p12 y que tenga contraseñas NO ASCII (ñ, acentos etc) hay que recurrir a Keystore Explorer . Esto se explica al final de otra entrada.

NOTA 2: Contraseñas con caracteres NO ASCII

Como el fichero conf/server.xml del Tomcat es XML, si tenemos  una contraseña como esta:

 keystorePass="mypasswordÑ.á.ñ.fin" FALLA!!!

Entonces no va arrancar bien Tomcat. Tenemos que "escapar" los acentos, ñ etc. Para ello nos basamos en la Dottoro y tendremos que cambiar:

Ñ por &#209;    (Ntilde)
ñ por &#241;     (ntilde)
á por &#225;     (aacute)

y quedaría

keystorePass="mypassword&#209;.&#225;.&#241;.fin" 

5.2b con certificado pem

Supongamos que hemos obtenido de LetsEncrypt, estos certificados que estan en la carpeta  /etc/letsencrypt/live/midominio.es
  • 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)
Modificamos el conector en el fichero server.xml de la carpeta conf de tomcat y para el puerto 19443 para que quede así para tomcat 9

 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"
 />

Para tomcat 10 tenemos



<!-- Define a SSL HTTP/1.1 Connector on port 8443
        This connector uses the JSSE configuration, when using APR, the
        connector should be using the OpenSSL style configuration
        described in the APR documentation -->
    <Connector port="8443" 
               protocol="org.apache.coyote.http11.Http11NioProtocol"
               SSLEnabled="true"
               maxThreads="150"> 
               <SSLHostConfig certificateVerification="require">
                 <Certificate
                   certificateFile="/etc/letsencrypt/live/midominio.es/cert.pem"
                   certificateChainFile="/etc/letsencrypt/live/midominio.es/chain.pem"
                   certificateKeyFile="/etc/letsencrypt/live/midominio.es/privkey.pem"
                   type="RSA"
                 />
              </SSLHostConfig>
    </Connector>



Si queremos pedir que el cliente se autentique con certificado, debemos activar la etiqueta clientAuth="true"  en tomcat 9, o certificateVerification="require" entomcat 10
Como vemos,
  1.  No nos ha hecho falta el fullchain.pem
  2. Tampoco nos ha hecho falta ninguna contraseña
  3. Estamos trabajando en un puerto https adicional 19443 (junto con el anterior 8443) sin ningún problema

Y ahora vamos al directorio "bin" del tomcat y paramos y rearrancamos el servicio

./shutdown.sh
./startup.sh

6. Acceder al servidor por SSL

Hemos dicho que el administrador de la red ha asignado a 192.192.1.25 el nombre de dominio csv.villaximo.es.

Si desde una máquina distinta al servidor le damos al navegador :

http://192.192.1.25:8080 -->    No se queja para nada y nos muestra la página
http:csv.villaximo.es:8080 -->  No se queja para nada y nos muestra la página

https://192.192.1.25:8443 --> Se queja y dice que el certificado no es correcto, pues el dominio no se corresponde con el que indica el certificado que es para csv.villaximo.es.

http://csv.villaximo.es:8443 -->  No se queja para nada y nos muestra la página

7. Duendes al acceder al servidor SSL

Antes, se tenia un certificado con el dominio csv.villaximodeabajo.es

Se le dijo al administrador de la red que cambiara el dominio de csv.villaximodeabajo.es a csv.villaximo.es

Durante 2 horas, ha habido máquinas que detectaban el nombre antiguo y máquinas que detectaban el nuevo. Por ello cuando hacía pruebas

No hay comentarios :

Publicar un comentario