Con Apache HTTP Server podemos publicar nuestras páginas Web con HTTPS (Hypertext Transfer Protocol Secure). Aquí veremos cómo hacerlo.
Introducción
En la actualidad prácticamente ninguna página Web usa HTTP. La mayoría usan HTTPS. HTTPS es un protocolo seguro que sirve (entre otras cosas) para cifrar las comunicaciones entre cliente y servidor.
Requisitos previos
Necesitamos un servidor Apache HTTP Server instalado e iniciado.
Configuración
Instalación de herramientas
Necesitaremos instalar dos herramientas, con los siguientes comandos:
Editor Vi:
apt install -y vim
Navegador Web de consola Links:
apt install -y links
Configuración de Apache HTTP Server
Y ahora configuramos el servidor Apache HTTP Server:
Activamos el módulo de Apache SSL:
a2enmod ssl
Y creamos la configuración SSL con:
a2ensite default-ssl
Iniciamos el servidor Apache con:
service apache2 start
O reiniciamos el servidor con:
service apache2 restart
Creación y configuración de certificados
Es necesario que creemos y configuremos claves y certificados para dos tipos de entidades:
- La Autoridad Certificadora (CA).
- El Servidor Web en el que vamos a configurar HTTPS.
Autoridad Certificadora (CA)
Creamos la clave de la Autoridad Certificadora:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 -out cakey.pem
Hacemos que la CA autofirme su propio certificado:
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 365
Nos pedirá estos datos:
- Country Name (2 letter code) [AU]:ES
- State or Province Name (full name) [Some-State]:Madrid
- Locality Name (eg, city) []:Madrid
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
- Organizational Unit Name (eg, section) []:MySection
- Common Name (e.g. server FQDN or YOUR name) []:localhost
- Email Address []:me@myemail.com
En este momento tenemos estos dos elementos:
- La clave de la CA (cakey.pem).
- El certificado auto-firmado por la autoridad certificadora, es decir, nosotros mismos (cacert.pem).
Ahora necesitamos unos directorios para que esta autoridad firme el certificado Web.
mkdir demoCA
mkdir demoCA/certs
mkdir demoCA/crl
mkdir demoCA/newcerts
mkdir demoCA/private
touch demoCA/index.txt
echo 02 > demoCA/serial
mv cacert.pem demoCA/
mv cakey.pem demoCA/private/
Y con esto, ya tenemos los archivos de la Autoridad Certificadora (CA).
Servidor Web
Creamos un par de claves:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 -out privkey-localhost.pem
Creamos la petición de firma del certificado:
openssl req -new -key privkey-localhost.pem -out certreq-localhost.crs
Nos pedirá estos datos:
- Country Name (2 letter code) [AU]:ES
- State or Province Name (full name) [Some-State]:Madrid
- Locality Name (eg, city) []:Madrid
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
- Organizational Unit Name (eg, section) []:MySection
- Common Name (e.g. server FQDN or YOUR name) []localhost
- Email Address []:me@myemail.com
No introducimos ningún valor cuando solicite Challenge password o Optional company name.
Ahora enviamos el request a la Autoridad Certificadora y la misma (nosotros) expidirá un certificado:
openssl ca -in certreq-localhost.crs -out cert-localhost.pem
Y después respondemos a todo con “y”.
Ahora configuramos Apache para usar estos certificados.
Antes de nada, verificamos:
openssl verify -CAfile demoCA/cacert.pem cert-localhost.pem
El sistema responde con:
cert-localhost.pem: OK
Configuración de Apache HTTP Server para usar SSL
Copiamos los ficheros importantes:
cp cert-localhost.pem /etc/ssl/certs/
cp demoCA/cacert.pem /etc/ssl/certs/
cp privkey-localhost.pem /etc/ssl/private/
Editamos la configuración de SSL de Apache:
vi /etc/apache2/sites-available/default-ssl.conf
Modificamos estas dos líneas con la ruta de nuestros archivos:
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
Por éstas:
SSLCertificateFile /etc/ssl/certs/cert-localhost.pem
SSLCertificateKeyFile /etc/ssl/private/privkey-localhost.pem
Después de esas dos, introducimos una nueva:
SSLCACertificateFile /etc/ssl/certs/cacert.pem
Grabamos y salimos de Vi con “:wq”.
Ahora hacemos un reload para que cargue la configuración:
service apache2 reload
Si obtenemos un error porque el servidor esta apagado, lo encendemos con:
service apache2 start
Prueba
Probamos de la siguiente manera (usando la consola de comandos y el navegador Web de texto “Links” en lugar de un navegador Web gráfico):
Cargamos la URL sin HTTPS:
links http://localhost
Después, caramos la URL con HTTPS:
links https://localhost
Nos dirá que el certificado es inválido (porque lo hemos creado nosotros mismos). Pulsmos en Sí y cargará la página sin problema.
Nota: Para evitar este mensaje, y para poder usar un navegador Web como Google Chrome sin ningún mensaje de alerta, necesitamos una Autoridad Ceritifadora valide el certificado que hemos creado.
So, what do you think ?