Mostrando entradas con la etiqueta DNS. Mostrar todas las entradas
Mostrando entradas con la etiqueta DNS. Mostrar todas las entradas

miércoles, 9 de abril de 2025

Nginx(XII) OpenResty Uvicorn. DNS. Configurar ambos para usar un certificado WildCard

 0. Introducción

En un post anterior vimos como crear una entidad certificadora CA y a partir de esta crea los certificados "wildcard" para los servidores.

Hay que recordar que para que el cliente reconozca como válido el certificdo wildcard del servidor que se conecta se debe:

  1. Instalar el certificado raiz de la CA en el navegador
  2. Asignar la IP del servidor a un nombre de dominio compatible con el dominio wildcard. (Si nuestro dominio wildcard es "*.municipio.es" entonces cualquier nombre de dominio como pepe.municipio.es o miservidor.municipio.es son válidos)
  3. Para asignar la dirección IP al dominio compatible en cuestión se debe hacer en el fichero "/etc/hosts" o decirle al administrador de red que le de la entrada al servidor de dominio (DNS)de la red.

Para asignar la IP al dominio utilizando un DNS:

a. Si usamos BIND9 (DNS clásico de Linux)

1. Se añade esta entrada al fichero /etc/bind/zones/db.municipio.es, (donde el nombre de dominio viene reflejado en el nombre del fichero)

miservidor   IN   A    192.168.28.XXX

En este caso el dominio asignado a la IP 192.168.28.XXX sería miservidor.municipio.es

2. Asegurarnos qu esta zona esté definida en /etc/bind/named.conf.local

zone "municipio.es" {
    type master;
    file "/etc/bind/zones/db.municipio.es";
};

3. Reiniciar el servicio DNS:

sudo systemctl restart bind9


b. Si usuamos DNS en Acive Directory

Puede haver un link a la configuración del DNS en un servidor como este :

%SystemRoot%\system32\mmc.exe %SystemRoot%\system32\dnsmgmt.msc

Y aparecer una pantalla como esta:


Vamos a la zona concreta de "municipio.es"

En click derecho -> Nuevo hosst (A o AAAA)

En nombre escribimos "miservidor"

En la dirección IP 192.168.28.XXX

Guardamos  y el nuevo FQDN (miservidor.municipio.es) ya apunta a la IP dada

Para probar ejecutamos uno de destos 2 comandos:

nslookup miservidor.municipio.es

dig miservidor.municipio.es

1. Configurar FastHTML (con uvicorn) para que se ejecute sobre un dominio

La pieza clave es la función __main__

if __name__ == "__main__":
  import uvicorn
  app.mount("/static", fh.StaticFiles(directory="/home/eduard/MyPython/11.softprop-01/static"), name="static")
  cert_path="/home/eduard/MyPython/11.softprop-01/static/certs/wildcard.municipio.es."
  uvicorn.run(app, host="miservidor.municipio.es", port=5001,	
    ssl_keyfile =cert_path+"key", 
    ssl_certfile=cert_path+"crt")

Hay que tener en cuenta que :

  • "app.mount" es para poder utilizar ficheros estáticos
  • En  uvicorn.run(app, host="miservidor.municipio.es", port=5001,  se puede cambiar el host="miservidor.municipio.es" por "192.168.28.XXX"
  • Y no puede fatar las referencias a las clave y certificado de servidor
Como tenemos dos programas python que se estan ejecutando sobre uvicorn (openresty.py y menu_main.py), hay que ealizar esta operaciónb en cada uno de ellos y controlando que los puertos no se solapen!!!

2. Buscar los ficheros de configuración de nginx afectados por el cambio anterior

Los ficheros afectados son nginx.conf y nginx.initial

cambio en nginx.conf:

-- cambiar:
upstream softpropsrv {
    server 0.0.0.0:5001;

-- por:
upstream softpropsrv {
    server 192.168.28.XXX:5001;


cambio en nginx.initial:

-- cambiar:
-- local res, err = httpc:request_uri("http://127.0.0.1:5000/auth", {

-- por:
local res, err = httpc:request_uri("https://edu.tavernes.es:5000/auth", {

3. Ver la ruta de los certificados de nginx.conf

En nginx.conf tenemos que comprobar que esta parte apunta a los certificdos de servidor correctos

server {
        #->listen       8001;
        listen       8449 ssl; #->New
        
        server_name  localhost;
        #server_name  edu.tavernes.es;
        
        #-> Begin new
        # SSL certificate configuration
        ssl_certificate     /usr/local/openresty/nginx/conf/wildcard.municipio.es.crt;
ssl_certificate_key /usr/local/openresty/nginx/conf/wildcard.municipio.es.key;
# Optional SSL settings for security and performance ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; # Common proxy settings (optional) proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https;





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