Vamos a realizar la implantaciond el protocolo HTTP/2 en una maquina debian strech, sobre un servidor apache.

Ahora vamos a configurar dos máquinas para las pruebas que más adelante realizaremos, y vamos a instalar una maquina con un servidor apache con “http/2” y otra máquina con “http/1.1” (el cual viene habilitado por defecto).

Para poder implantar http/2 en un servidor apache primero tenemos que tener un certificado ssl instalado, para ello vamos a realizar un certificado auto firmado con «OpenSSL».

Generar certificado auto firmado

Un certificado SSL es un certificado digital utilizado por el protocolo para el encriptamiento de la información.

Este certificado es proporcionado por un proveedor autorizado (Verisign, Thawte, Comodo, etc…) y es enviado al cliente por el servidor con quien estamos estableciendo una conexión segura.

Hay muchos servicios que utilizan este protocolo, algunos ejemplos pueden ser: HTTPS, SMTPS, IMAPS, SSH, POP3S, etc…

Instalar OpenSSL

El primer paso sera instalar openssl apt install openssl

Creamos una clave privada

La llave privada nos será útil para la generación del certificado. Una vez creado, nuestro certificado SSL dependerá de esta llave para la implementación del mismo en cualquier servicio que requiera una conexión segura.

Por ejemplo, vamos a crear una clave de 1024 bits:

root@http2:/home/usuario# openssl genrsa -out server.key 1024
Generating RSA private key, 1024 bit long modulus
....++++++
..........................................................++++++
e is 65537 (0x010001)

Generar CSR

Un CSR es la base para un certificado SSL, en él se definen datos como el dominio, organización, ubicación, información de contacto, entre otros.

Es importante destacar que estos pasos también son necesarios cuando vas a adquirir un certificado SSL de un proveedor autorizado, durante la gestión del mismo, el proveedor va a solicitar este archivo para crear tu certificado. Por lo tanto, debemos tener mucho cuidado en que la información que ingresamos sea correcta.

Para generar el CSR debemos ejecutar el siguiente comando, si te fijas uno de los parámetros que introducimos es la clave privada.

root@http2:/home/usuario# openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]: Seville
Locality Name (eg, city) []: Seville
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Juanlu Ramirez
Organizational Unit Name (eg, section) []: Juanlu Ramirez
Common Name (e.g. server FQDN or YOUR name) []: Juanlu
Email Address []: admin@juanluramirez.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Generamos certificado SSL

Para generar el certificado SSL vamos a necesitar tanto la llave privada como el CSR que acabamos de crear.

Para generar el certificado SSL debemos ejecutar el siguiente comando:

root@http2:/home/usuario# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = ES, ST = Seville, L = Seville, O = Juanlu Ramirez, OU = Juanlu Ramirez, CN = Juanlu, emailAddress = admin@juanluramirez.com
Getting Private key

Instalación pila LAMP

Para poder instalar un CMS vamos a intalar la pila LAMP apt install apache2 php mariadb-server y ya tendremos el servidor web instalado.

Habilitar modulo SSL

Primero copiamos los certificados en /etc/sssl/certs/

root@http2:/home/usuario# cp server.crt /etc/ssl/certs/
root@http2:/home/usuario# cp server.key /etc/ssl/certs

Y lo habilitamos:

root@http2:/home/usuario# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2

Y modificamos el vhosts por defecto de SSL /etc/apache2/sites-available/default-ssl, borramos todo el contenido y añadimos lo siguiente.

<IfModule mod_ssl.c>
  <VirtualHost _default_:443>
    ServerName www.http2.com
    ServerAdmin admin@juanluramirez.com
    DocumentRoot /var/www/html
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/html>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    SSLEngine on
    SSLCertificateKeyFile /etc/ssl/certs/server.key
    SSLCertificateFile /etc/ssl/certs/server.crt
    #SSLCACertificateFile /etc/ssl/certs/bundle.crt
    BrowserMatch "MSIE [2-6]" \
      nokeepalive ssl-unclean-shutdown \
      downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
  </VirtualHost>
</IfModule>

Habilitamos el vhosts a2ensite default-ssl y reiniciamos el servidor apache systemctl restart apache2.

Habilitamos el modulo http2

Primero activamos el paquete nghttp2 apt install nghttp2, y habilitamos el modulo http2:

root@http2:/home/usuario# a2enmod http2
Enabling module http2.
To activate the new configuration, you need to run:
  systemctl restart apache2

Y añadimos la siguiente linea a nuestro fichero «default-ssl», justo detras de los certificados especificados:

 Protocols h2 http/1.1

Y ya solo queda reiniciar el servidor web systemctl restart apache2