Escenario: HTTPS en Apache Web Server
Sumario
Introdución
O obxectivo deste escenario é explicar como configurar o servidor web Apache para traballar tanto con http como https:
Implementar un sistema coas seguintes características:
- O servidor servidor web Apache corre nun Linux Ubuntu Server 22.04.
- O servidor web terá un sitio por defecto e dous dominios: www.tenda1.example e www.tenda2.example.
- O acceso ós dous dominios poderá facerse tanto por http coma por https.
- Cada dominio usará o seu propio certificado.
- Os certificados dixitais serán crearanse por nós (certificados autoasinados).
NOTA. Empregaremos o dominio .example seguindo a recomendación da IANA en relación á elaboración de documentación.
Configuración do escenario
A creación e configuración dos equipos a usar no Escenario 5C implica configurar o server (servidor web) e o equipo cliente dende onde visitaremos as páxinas web dos sitios www.tenda1.example e www.tenda2.example. A continuación explícase:
Como crear/configurar o server mediante un script Como configurar a resolución dns do cliente para as probas de funcionamento A configuración do cliente explícase ó final desta páxina.
Configuración do server
Creación automática do escenario
Como primeiro paso hai que levar o arquivo script_esc_5C.tar.gz ó equipo anfitrión dos contedores. Esto dependerá da situación particular de cada un; eu normalmente nos equipos instalo o servidor openssh-server e subo os arquivos mediante scp (dende Windows pódese usar a utilidade pscp.exe de putty):
~$ scp -r script_esc_5C.tar.gz asir@192.168.1.150:
script_esc_5C.tar.gz 100% 1252 958.3KB/s 00:00
Unha vez subido procedemos a descomprimilo:
~$ tar zxvf script_esc_5C.tar.gz
script_esc_5C/profile_WAN script_esc_5C/network_3IPS_PLANTILLA.yml script_esc_5C/config_server_incus.yml script_esc_5C/ script_esc_5C/escenario_5C.sh ~$ cd script_esc_5C/ ~/script_esc_5C$ chmod 755 escenario_5C.sh. ~/script_esc_5C$ ls -lhF <pre> total 16K -rw-rw-r-- 1 asir asir 2,1K feb 7 22:10 config_server_incus.yml -rwxr-xr-x 1 asir asir 1,7K feb 7 22:11 escenario_5C.sh* -rw-rw-r-- 1 asir asir 211 feb 7 22:07 network_3IPS_PLANTILLA.yml -rw-rw-r-- 1 asir asir 190 feb 7 22:03 profile_WAN
~/script_esc_5C$ ./escenario_5C.sh
----- Escenario 5C -----
Seleccionar a operación:
1. Crear escenario
2. Parar server
3. Arrincar server
4. Borrar escenario
------
1
Crear escenario
Network wan created
Perfil WAN creado
------------------------------
creando server
------------------------------
Launching server-https
+--------------+---------+-------------------+----------+-----------+----------------------+
| NAME | STATE | IPV4 | PROFILES | SNAPSHOTS | LAST USED AT |
+--------------+---------+-------------------+----------+-----------+----------------------+
| server-https | RUNNING | 192.0.2.13 (eth0) | WAN | 0 | 2026/02/07 22:22 CET |
| | | 192.0.2.12 (eth0) | | | |
| | | 192.0.2.11 (eth0) | | | |
+--------------+---------+-------------------+----------+-----------+----------------------+
Tras deixar actuar un par de minutor a cloud-init para a configuración inicial da máquina, verifícase que todo foi ben:
~/script_esc_5C$ incus shell server-https ~# tail -f /var/log/cloud-init-output.log
...
To activate the new configuration, you need to run:
systemctl restart apache2
Enabling site default-ssl.
To activate the new configuration, you need to run:
systemctl reload apache2
--2026-02-07 22:24:57-- https://www.adminer.org/latest.php
Resolving www.adminer.org (www.adminer.org)... 95.168.218.179, 2a01:28:ca:112::1:907
Connecting to www.adminer.org (www.adminer.org)|95.168.218.179|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: static/download/5.4.1/adminer-5.4.1.php [following]
--2026-02-07 22:24:57-- https://www.adminer.org/static/download/5.4.1/adminer-5.4.1.php
Reusing existing connection to www.adminer.org:443.
HTTP request sent, awaiting response... 200 OK
Length: 507471 (496K) [application/octet-stream]
Saving to: ‘/var/www/html/adminer.php’
0K .......... .......... .......... .......... .......... 10% 467K 1s
50K .......... .......... .......... .......... .......... 20% 965K 1s
100K .......... .......... .......... .......... .......... 30% 10.9M 0s
150K .......... .......... .......... .......... .......... 40% 1.02M 0s
200K .......... .......... .......... .......... .......... 50% 28.6M 0s
250K .......... .......... .......... .......... .......... 60% 16.3M 0s
300K .......... .......... .......... .......... .......... 70% 23.7M 0s
350K .......... .......... .......... .......... .......... 80% 22.4M 0s
400K .......... .......... .......... .......... .......... 90% 1.06M 0s
450K .......... .......... .......... .......... ..... 100% 114M=0.3s
2026-02-07 22:24:58 (1.82 MB/s) - ‘/var/www/html/adminer.php’ saved [507471/507471]
Cloud-init v. 25.2-0ubuntu1~22.04.1 finished at Sat, 07 Feb 2026 21:24:58 +0000. Datasource DataSourceNoCloud [seed=/var/lib/cloud/seed/nocloud-net]. Up 144.59 seconds
root@server-https:~# cloud-init status
status: done
Configurar a resolución DNS dende os clientes
Para poder acceder ós sitios web dende os clientes hai que configurar a resolución dns.
Hai dúas posibles solucións:
- Instalar un servidor dns cunha zona para cada un dos dominios tenda1.example e tenda2.example.
- Nos equipos cliente poden engadirse as entradas correspondentes ós hosts www.tenda1.example e www.tenda2.example no arquivo hosts.
Aínda que non é a mellor solución, por ser un escenario de probas escolleuse a segunda por ser a máis rápida e sinxela. A modo de exemplo así quedaría o arquivo hosts dun cliente linux:
$ sudo nano /etc/hosts
127.0.0.1 localhost 127.0.1.1 lxd 192.0.2.11 www.tenda1.example 192.0.2.12 www.tenda2.example # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Probamos a resolución DNS e a conexión co server dende o equipo cliente:
$ ping -c 2 www.tenda1.example
PING www.tenda1.example (192.0.2.11) 56(84) bytes of data. 64 bytes from www.tenda1.example (192.0.2.11): icmp_seq=1 ttl=64 time=0.095 ms 64 bytes from www.tenda1.example (192.0.2.11): icmp_seq=2 ttl=64 time=0.086 ms --- www.tenda1.example ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1004ms rtt min/avg/max/mdev = 0.086/0.090/0.095/0.010 ms
$ ping -c 2 www.tenda2.example
PING www.tenda2.example (192.0.2.12) 56(84) bytes of data. 64 bytes from www.tenda2.example (192.0.2.12): icmp_seq=1 ttl=64 time=0.131 ms 64 bytes from www.tenda2.example (192.0.2.12): icmp_seq=2 ttl=64 time=0.104 ms --- www.tenda2.example ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.104/0.117/0.131/0.017 ms
En sistemas Windows habería que editar, como administrador, o arquivo C:\Windows\System32\drivers\etc\hosts e engadir as liñas:
192.0.2.11 www.tenda1.example 192.0.2.12 www.tenda2.example
Apache, http e virtualhosts
No caso de non usar o script, hai que instalar o servidor web Apache no servidor:
$ sudo apt update $ sudo apt install apache2
Verifícase que o servidor web Apache está correndo:
$ sudo ss -ltnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=168,fd=13))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=216,fd=3))
LISTEN 0 511 *:80 *:* users:(("apache2",pid=1445,fd=4),("apache2",pid=1444,fd=4),("apache2",pid=1443,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=216,fd=4))
Accedendo dende un cliente ó servidor obtense a páxina principal do sitio por defecto:
Sitio Web por defecto
Fig. Páxina por defecto de Apache en http://192.0.2.13
En Linux Ubuntu Server os arquivos de configuración do servidor Apache están na carpeta /etc/apache2:
$ ls -lhF /etc/apache2/
total 32K -rw-r--r-- 1 root root 7.1K Mar 8 17:32 apache2.conf drwxr-xr-x 2 root root 7 May 7 17:58 conf-available/ drwxr-xr-x 2 root root 7 May 7 17:58 conf-enabled/ -rw-r--r-- 1 root root 1.8K Feb 23 2021 envvars -rw-r--r-- 1 root root 31K Feb 23 2021 magic drwxr-xr-x 2 root root 143 May 7 17:58 mods-available/ drwxr-xr-x 2 root root 31 May 7 17:58 mods-enabled/ -rw-r--r-- 1 root root 320 Feb 23 2021 ports.conf drwxr-xr-x 2 root root 4 May 7 17:58 sites-available/ drwxr-xr-x 2 root root 3 May 7 17:58 sites-enabled
En Apache 2.X hai que diferenciar entre sitios web dispoñibles e sitios habilitados. Os dispoñibles non son accesibles por parte dos clientes; en cambio, os habilitados sí.
Os arquivos dos sitios web dispoñibles poden verse en /etc/apache2/sites-available/ e os habilitados poden verse en /etc/apache2/sites-enabled/.
A instalación de Apache por defecto ven con dous sitios dispoñibles (un para http e outro para https) estando activado unicamente o sitio para acceso por http:
$ ls -lhF /etc/apache2/sites-available/ total 6.5K -rw-r--r-- 1 root root 1.4K Feb 23 2021 000-default.conf -rw-r--r-- 1 root root 6.2K Feb 23 2021 default-ssl.conf ubuntu@server5C:~$ ls -lhF /etc/apache2/sites-enabled/ total 512 lrwxrwxrwx 1 root root 35 May 7 17:58 000-default.conf -> ../sites-available/000-default.conf
Estos arquivos de configuración poden usarse como punto de partida para crear novos sitios web; de feito, así o faremos neste escenario. A continuación crease o arquivo de configuración do sitio web para www.tenda1.example tomando como punto de partida o arquivo de configuración do sitio por defecto:
$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/www.tenda1.example.conf $ sudo nano /etc/apache2/sites-available/www.tenda1.example.conf
<VirtualHost 192.0.2.11:80>
ServerName www.tenda1.example
ServerAdmin webmaster@localhost
DocumentRoot /var/www/tenda1.example
ErrorLog ${APACHE_LOG_DIR}/tenda1.example_error.log
CustomLog ${APACHE_LOG_DIR}/tenda1.example_access.log combined
</VirtualHost>
Personalízanse as directivas:
- Virtualhost: indícase a IP e porto asociado ó sitio web.
- ServerName: nome de dominio asociado ó virtualhost.
- DocumentRoot: carpeta onde estarán os arquivos do sitio web.
- ErrorLog e CustomLog: para indicar os arquivos de logs do sitio web. Especificáronse uns propios para o sitio www.tendaprobas1.com para non compartilos con outros dominios.
Créase o directorio e a páxina principal do sirio www.tendaprobas1.com:
$ sudo mkdir /var/www/tenda1.example $ sudo nano /var/www/tenda1.example/index.html
<html> <head><title>Tenda Probas 1</title></head> <body> <b>TENDAPROBAS1</b> </body> </html>
Actívase o sitio:
$ sudo a2ensite www.tenda1.example.conf
Enabling site www.tenda1.example. To activate the new configuration, you need to run: systemctl reload apache2
$ sudo systemctl reload apache2
Usando o comando apache2ctl podemos ver os sitios servidos polo servidor Apache e verificamos que o sitio www.tenda1.example está activo e correndo no porto 80/tcp da IP 192.0.2.11.
Estamos a traballar con hosts virtuais baseados en IP; é dicir, cada sitio ten a súa propia combinación IP-porto:
$ sudo apache2ctl -S
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message VirtualHost configuration: 192.0.2.11:80 www.tenda1.example (/etc/apache2/sites-enabled/www.tenda1.example.conf:1) *:80 127.0.0.1 (/etc/apache2/sites-enabled/000-default.conf:1) ServerRoot: "/etc/apache2" Main DocumentRoot: "/var/www/html" Main ErrorLog: "/var/log/apache2/error.log" Mutex watchdog-callback: using_defaults Mutex default: dir="/var/lock/apache2" mechanism=fcntl PidFile: "/var/run/apache2/apache2.pid" Define: DUMP_VHOSTS Define: DUMP_RUN_CFG User: name="www-data" id=33 Group: name="www-data" id=33 ubuntu@server5C:~$
Se accedemos dende un navegador web:
Tenda 1
Fig. Acceso por http ó sitio www.tenda1.example
Repítese o proceso para www.tenda2.example
$ sudo cp /etc/apache2/sites-available/www.tenda1.example.conf /etc/apache2/sites-available/www.tenda2.example.conf $ sudo nano /etc/apache2/sites-available/www.tenda2.example.conf
<VirtualHost 192.0.2.12:80>
ServerName www.tenda2.example
ServerAdmin webmaster@localhost
DocumentRoot /var/www/tenda2.example
ErrorLog ${APACHE_LOG_DIR}/tenda2.example_error.log
CustomLog ${APACHE_LOG_DIR}/tenda2.example_access.log combined
</VirtualHost>
sudo mkdir /var/www/tenda2.example sudo nano /var/www/tenda2.example/index.html
<html> <head><title>Tenda Probas 2</title></head> <body> <b>TENDAPROBAS2</b> </body> </html>
$ sudo a2ensite www.tenda2.example.conf
Enabling site www.tenda2.example. To activate the new configuration, you need to run: systemctl reload apache2
$ sudo systemctl reload apache2 $ ls -lhF /etc/apache2/sites-enabled/
total 1.5K lrwxrwxrwx 1 root root 35 May 7 17:58 000-default.conf -> ../sites-available/000-default.conf lrwxrwxrwx 1 root root 42 May 7 18:02 www.tenda1.example.conf -> ../sites-available/www.tenda1.example.conf lrwxrwxrwx 1 root root 42 May 7 18:04 www.tenda2.example.conf -> ../sites-available/www.tenda2.example.conf
$ sudo apache2ctl -S
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message VirtualHost configuration: 192.0.2.11:80 www.tenda1.example (/etc/apache2/sites-enabled/www.tenda1.example.conf:1) 192.0.2.12:80 www.tenda2.example (/etc/apache2/sites-enabled/www.tenda2.example.conf:1) *:80 127.0.0.1 (/etc/apache2/sites-enabled/000-default.conf:1) ServerRoot: "/etc/apache2" Main DocumentRoot: "/var/www/html" Main ErrorLog: "/var/log/apache2/error.log" Mutex watchdog-callback: using_defaults Mutex default: dir="/var/lock/apache2" mechanism=fcntl PidFile: "/var/run/apache2/apache2.pid" Define: DUMP_VHOSTS Define: DUMP_RUN_CFG User: name="www-data" id=33 Group: name="www-data" id=33 ubuntu@server5C:~$
Se accedemos dende un navegador web:
Sitio Web tenda 2
Fig. Acceso por http ó sitio www.tenda2.example
Neste momento temos configurado o acceso por http ós sitios www.tenda1.example e www.tenda2.example. Na seguinte sección configuraremos o acceso por https.