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

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

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} 



jueves, 2 de diciembre de 2021

(FALLA) Instalar certificado LetsEncrypt en Apache Ubuntu server

0. Introducción

Se ha seguido esta web de Digital Ocean y Devanswers 

1. Identificar el dominio

Para tener un dominio virtual hay que tener un servidor de DNS que reconozca a dicho dominio para que lo redireccione.

En el caso que no lo tengamos, para hacer las pruebas el punto 2 debemos modificar el fichero /etc/hosts para que pueda ver ese nombre, tanto en el servidor local como en cada una de las máquinas que quieran acceder a dicho servidor.

En ese caso se definirán los dominios o hosts (webprop.es y www.webprop.es)

NOTA: Para que letsencrypt pueda darte un certificado, debes tener el dominio registrado, es decir, que cualquiera, desde cualquier sitio pueda hacer un ping a tu dominio y que esté localizable. Para ello se puedes probar el google cloud DNS que tiene un período de pruebas. Yo no lo he probado, pero algunos dicen que funciona.

Para poder gestionar el dominio debes:

a. Crear el dominio y registrarlo

b. En tu firewall debes redirigir este dominio a la máquina y puerto correcto

c. En tu servidor interno de DNS debes redirigir el dominio a tu máquina y puerto internos correcto para que no vaya al exterior y vuelva a entrar


2. Localizar los ficheros de configuración

Fichero nº1:

Veamos el primer fichero de configuración (según Rich Bowen) , para ello ejecutamos

httpd -V

Y si no la encuentra, ejecutar esta otra

apache2ctl -V

Y contesta esto

Server version: Apache/2.4.29 (Ubuntu)

Server built:   2021-09-28T22:27:27

Server's Module Magic Number: 20120211:68

Server loaded:  APR 1.6.3, APR-UTIL 1.6.1

Compiled using: APR 1.6.3, APR-UTIL 1.6.1

Architecture:   64-bit

Server MPM:     event

  threaded:     yes (fixed thread count)

    forked:     yes (variable process count)

Server compiled with....

 -D APR_HAS_SENDFILE

 -D APR_HAS_MMAP

 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)

 -D APR_USE_SYSVSEM_SERIALIZE

 -D APR_USE_PTHREAD_SERIALIZE

 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT

 -D APR_HAS_OTHER_CHILD

 -D AP_HAVE_RELIABLE_PIPED_LOGS

 -D DYNAMIC_MODULE_LIMIT=256

 -D HTTPD_ROOT="/etc/apache2"

 -D SUEXEC_BIN="/usr/lib/apache2/suexec"

 -D DEFAULT_PIDLOG="/var/run/apache2.pid"

 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"

 -D DEFAULT_ERRORLOG="logs/error_log"

 -D AP_TYPES_CONFIG_FILE="mime.types"

 -D SERVER_CONFIG_FILE="apache2.conf"

Donde podemos adivinar que el fichero de configuración del httpd es /etc/apache2/apache2.conf

que se ha obtenido al unir las 2 cadenas marcadas en color azul y rojo

Este fichero lo utilizaríamos si quisiésemos tener más de un nombre de dominio junto diferentes IPs para un mismo servidor y se acutaría creando diferentes entradas de <VirtualHost IP:80> en este fichero, indicacando diferentes IPs para cada servidor virtual, por ejemplo 

<VirtualHost 172.20.30.40:80>

Para el caso de querer tener un solo dominio, me parece más sencillo utilizar el segundo fichero que expongo a continuación

Fichero nº2:

Vamos a la carpeta /etc/apache2/sites-available  y en mi caso hago un ls y veo que hay 2 ficheros: 000-default.conf y default-ssl.conf siendo el primero el que nos interesa.

Supongamos que queremos definir untenmos un dominio llamado webprop.es para ello editamos el fichero 000-default.conf y le dejamos este contenido

sudo nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
    ServerAdmin webmaster@webprop.es
    ServerName webprop.es
    ServerAlias www.webprop.es
    DocumentRoot /var/www/webprop.es/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Ojo: en la primera línea vemos que para cualquier IP le asignamos el dominio que definimos posteriormente (webprop)

Salvamos con CTRL + O y salimos conCTRL + X,

Ahora creamos un directorio

sudo mkdir -p /var/www/webprop.es/public_html

Creamos un fichero index.html (que és el que nos dará la bienvenida al apuntar con el navegador (http://webprop.es/) para probar

sudo nano /var/www/webprop.es/public_html/index.html
<html>
   <head>
     <title>Welcome!</title>
   </head>
   <body>
      <h1>Welcome to webprop.es! Hava a nice day!</h2>
   </body>
</html>
Salvamos con CTRL + O y salimos conCTRL + X,


Ahora comprobamos errores

apachectl configtest

y nos da errores

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message

Para definir la directiva ServerName globalmente tenenos que modificar el fichero 1 ( /etc/apache2/apache2.conf) :

sudo nano /etc/apache2/apache2.conf
Y le añadimos esta línea al final

ServerName webprop.es

Salvamos con CTRL + O y salimos conCTRL + X,

Reiniciamos el servidor apache y si le damos otra vez a comprobar errores (apachectl configtest) vemos que ya no tenemos errores.


3. Instalar Certbot

Añadimos al repositorio

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

Instalamos el paquete Apache Certbot

  • sudo apt install python-certbot-apache

4. Obtener un certificado SSL

OJO: Como requisito previo, debemos tener abierto el firewall en el puerto 80 para este dominio  !!!!!!!
Esto conlleva muchas vulnerabilidades, por tanto, dejarlo solamente abierto por el tiempo necesario para que LetsEncrypt pueda verificar que el servidor existe !

Ejecutamos

sudo certbot --apache
o también podemos indicarle el dominio directamente

sudo certbot --apache -d webprop.es

Nos pide un email y luego nos pide que estemos de acuerdo

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel:

A continuación nos sugiere que recibamos información al respecto

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.

Ahora nos dice que dominios queremos activar

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: webprop.es
2: www.webprop.es
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Aceptamos todos y SI NO HEMOS CREADO UN DOMINIO REGISTRADO, NOS DA ESTOS ERRORES:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for webprop.es
http-01 challenge for www.webprop.es
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. www.webprop.es (http-01): urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for www.webprop.es - check that a DNS record exists for this domain, webprop.es (http-01): urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for webprop.es - check that a DNS record exists for this domain

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: www.webprop.es
   Type:   None
   Detail: DNS problem: NXDOMAIN looking up A for www.webprop.es -
   check that a DNS record exists for this domain

   Domain: webprop.es
   Type:   None
   Detail: DNS problem: NXDOMAIN looking up A for webprop.es - check
   that a DNS record exists for this domain

Por tanto hay que tener los dominios registrados, y abierto el puerto 80 en el firewall, ya que si no le hemos hecho puede responder que hay un conncetion time-out por no poder acceder al puerto 80. En este caso contesta favorablemente
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Pero yo le he contestado la opción 2 y me contesta

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for webprop.es
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://webprop.es

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=webprop.es
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/webprop.es/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/webprop.es/privkey.pem
   Your cert will expire on 2022-03-07. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
Pero mi gozo en un pozo, pues no me deja utilizar el puerto 8443, solo el puerto 80 y 443

Veamos como solucionar el entuerto 

5. Deshacer el entuerto

1. Debemos ver si al menos los certificados se han descargado, para ello hacemos:

sudo certbot certificates
y nos muestra
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: webprop.es
    Domains: webprop.es
    Expiry Date: 2022-03-07 12:30:51+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/webprop.es/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/webprop.es/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Con lo que nuestros certificados parecen totalmente generados
Si vamos al directorio  /etc/letsencrypt/live/webprop.es , vemos que están estos ficheros:
  • cert.pem
  • chain.pem
  • fullchain.pem
  • privkey.pem
  2. Tenemos que advertir que ha cambiado la configuración del Tomcat, en concreto:

  2.1. En el fichero /etc/apache/etc/apache2/sites-available/000-default.conf ha añadido líneas de configuración al final de la etiqueta <VirtualHost *:80> que debemos eliminar o comentar
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.csv.tavernesvalldigna.es [OR]
RewriteCond %{SERVER_NAME} =csv.tavernesvalldigna.es
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Con lo que nos queda

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

#       ServerAdmin webmaster@localhost
#       DocumentRoot /var/www/html


        ServerAdmin webmaster@webprop.es
        ServerName webprop.es
ServerAlias webprop.es
DocumentRoot /var/www/webprop.es/public_html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf #Added by CertBot #RewriteEngine on #RewriteCond %{SERVER_NAME} =www.csv.tavernesvalldigna.es [OR] #RewriteCond %{SERVER_NAME} =csv.tavernesvalldigna.es #RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>

2.2 También ha credo el fichero /etc/apache/etc/apache2/sites-available/000-default-le-ssl.conf que debemos borrar.

2.3 Parece ser que el fichero conf/server.xml no ha cambiado.

Vamos ahora a la siguiente entrada del blog para arreglar el asunto.