El protocolo HTTPS (puerto 443) nos va a permitir aportar un nivel de seguridad gracias al cifrado de la comunicación entre un cliente y un servidor web. El cifrado lo realiza el protocolo criptográfico TLS (sucesor de SSL) que trabaja en el nivel de transporte.
El protocolo TLS usa criptografía asimétrica para identificar a las partes de la comunicación y para intercambiar una clave simétrica con la cual se cifrará el contenido de la comunicación.
Al usar criptografía asimétrica será necesario que el servidor web disponga de un par de claves pública y privada, y de un certificado que incluya la clave pública, firmado por alguna Autoridad Certificadora (CA) o al menos autofirmado. El formato utilizado con TLS para el manejo de los certificados es el X.509.
El papel de las CAs es el de aportar la confianza necesaria para que todo el mundo esté seguro de que un determinado certificado es de quien dice ser. El nivel de confianza lo da el procedimiento que implementa la CA para llevar a cabo el proceso de solicitud, firma y entrega del certificado.
Cuando un cliente comienza una comunicación con un servidor usando el protocolo HTTPS se dan una serie de pasos previos al envío, propiamente dicho, de la información que solicita el cliente. Estos pasos son:
- El cliente envía al servidor una URL de petición de recurso que comienza con el identificador del protocolo HTTPS: https://...
- El servidor contesta con el envío de un certificado en formato X.509 que contiene entre otras cosas la clave pública del servidor y la firma de la CA.
- El cliente comprueba la autenticidad del certificado recibido haciendo uso de la firma que trae el certificado y la clave pública de la CA que posee el navegador, siempre y cuando la CA esté en su lista de CAs. Si por el contrario, la CA que firma el certificado no está en el navegador, este no podrá comprobar la autenticidad del certificado, y pasa a hacer una pregunta, delegando en el usuario la responsabilidad de aceptar o no el certificado. Si para el usuario, el certificado no es de confianza y lo rechaza, aquí termina la comunicación cliente/servidor.
- A este punto se llega si el navegador automáticamente ha aceptado como auténtico el certificado o es el usuario el que lo ha aceptado manualmente. En ambos casos, el cliente genera y envía una clave simétrica aleatoria que será usada para cifrar los datos de la comunicación. Esta clave no se envía en claro, sino que el cliente la cifra con la clave pública del servidor, en la que, a estas alturas, ya se confía.
- El servidor, a través de su clave privada, descifra la clave simétrica, y a partir de ahora, el resto de la comunicación entre el cliente y el servidor irá cifrada con esta última clave. La clave simétrica solo sirve para la sesión que se ha abierto, una vez cerrada, el proceso se inicia de nuevo.
Lo primero que vamos a hacer para configurar HTTPS en Apache, es preparar la clave privada del servidor, usaremos para ello el comando openssl. Es necesario, para lo que vamos a hacer, que los paquetes openssl y ca-certificates estén instalados, algo que suele suceder por defecto.
La clave privada que vamos a crear será del tipo RSA y tendrá una longitud de 4096 bits. Este fichero, y los sucesivos que vamos a crear, los vamos a guardar inicialmente en la carpeta /root/certificados/www-asir-com, pues van a servir para el dominio www.asir.com. Al fichero con la clave privada lo vamos a proteger con la máscara de permisos 600.
# mkdir -p /root/certificados/www-asir-com
# cd /root/certificados/www-asir-com/
# openssl genrsa 4096 > www-asir-com.key
Generating RSA private key, 4096 bit long modulus
.............................++
......++
e is 65537 (0x10001)
# chmod 600 www.asir-com.key
A continuación vamos a crear un fichero de solicitud de firma de certificado que enviaremos a la CA, por ejemplo CAcert u otra, para así tener el certificado firmado que estamos buscando.
# openssl req -new -key www-asir-com.key -out www-asir-com.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]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.asir.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# ls
www-asir-com.csr www-asir-com.key
La opción req -new utilizada con el comando openssl es la que indica que queremos generar el fichero de solicitud de firma de certificado. Con -key indicamos el fichero de clave privada que se debe utilizar para generar el certificado, y con -out especificamos el fichero de solicitud de firma de certificado.
De toda la información que se pide y que irá incluida en el certificado, la verdaderamente importante es "Common Name", que es donde pondremos el dominio en el que se va a utilizar el certificado.
En este momento deberíamos enviar el fichero .csr a la CA para que lo firme y nos lo devuelva, pero como nos interesa solamente la configuración del protocolo HTTPS con Apache, vamos a llevar a cambo un método más casero, consistente en auto-firmar nosotros mismos el certificado, lo cual haremos con el siguiente comando:
# openssl x509 -req -days 365 -in www-asir-com.csr -signkey www-asir-com.key -out www-asir-com.pem
Signature ok
subject=/C=ES/ST=Some-State/O=Internet Widgits Pty Ltd/CN=www.asir.com
Getting Private key
# ls
www-asir-com.csr www-asir-com.key www-asir-com.pem
El certificado está en formato X.509 y será válido durante 365 días, si no se renueva antes, caducará.
Una consecuencia del auto-firmado será que cuando el cliente reciba el certificado nos avisará de que no es de confianza y manualmente el usuario tendrá que aceptarlo si así lo ve conveniente.
Se han creado tres ficheros:
- La clave privada: www-asir-com.key
# cat www-asir-com.key
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
- La solicitud de firma de certificado para la CA: www-asir-com.csr
# cat www-asir-com.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIEoTCCAokCAQAwXDELMAkGA1UEBhMCRVMxEzARBgNVBAgMClNvbWUtU3RhdGUx
ITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEVMBMGA1UEAwwMc3Jp
LmFzaXIuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA015OXdOd
+Kb0LGHM7yEKUBSikSGzyu5Vi5uGsEnuOLIHSfpHd4QJ5A24jgcDwFfRBfb9NKPM
RaY6qDtEmk/QwkgwwYxRf8S0XSQtLsoUmsjGQ9tcFSi4dYzcxhcHH8cwpuVcbVti
MmcfbOi++RT7j8z1jcz/Vyg2447h10PXC+M8wDqr/cx+emOoW25UkFAOiBc6waUY
ppD79p3BVw5pSw1qwpGwkbMEuT7ROXvRdpmfV+mJqPM3Q6qoRihNJg5SGcvcK+Ro
Biq6kf4EHzXJ4dFG+lugme60PAi04CICjlx7wjYVo6OaCuUQISI8ObZHN/ubbqF9
oAYguyypLb4CbFfxLbNuzOJEVhf5NeVzcoQHMlTr4J9BKgWqxSrNl6si2HTaPauM
cyGH7vhtEFJ3Y3fZE9JPPw5fTZxQOeYx382gQmkFhOl+6qs/UJKJXjbt0dnqYf7G
yiD9nSxfBwX7RL2H1BtIEmEx82wzmSY3DzdAwtMXvEJ822ljwxlfkOb4jPy6uW2A
jhR52ZHQ71Ha87VNdUDl+dg1eoh/dyaonLco88FsFoqBqBUKfj8wlUfLEzya9ou0
cC5BfJHkYP3H4xwI7VVRB3riy/FHhSz+4W/rdWzRqj+XanW83LnLdRgdfaFtqVSJ
hynOSKeUSbWaKJ0E6Jl9lpx7DbBbRFSQOp8CAwEAAaAAMA0GCSqGSIb3DQEBCwUA
A4ICAQA0XRo11YQAtFd4zYGP4AfutxoxvUtEdrozFLSOgzQs7x394Rg3dGLtFlke
BpX1fN+CIuI35jxUAIij1V7LDbdclc8/WRO+SBmbweJpsXnY5wKojsyC+MGV8lXp
8eAgjzsTZhdhvW1PL0IRbZUjxLisDNm+uUIxQa56qHCryuPdQMyVyHvEwH89ak0s
pIBJQSthGRuNAsVfOYzvRe7ERXeGge/L269KaulbJkbo3jEnL4DcQE4GL99LGE+s
O0uIyi+nRhPlk3aZ0kranvGXD+SQgxDlhiAi/5eRAOYupIfLCUQpMkRbCTU6SSfF
/B3/tVJ9iYIhph8WGRXpmt4b9+nDVv26Ko0AJDtzXPxI0lT5FQT2B2S7JWAtjpjo
4PU2C9urdRR0Flp1luzU2OwHCgO6HxkPHHd7j98xchDluHhjUZsCNfUngxnaF2sh
9rR+6ZWA2exuNkFNTnAD0NALTJ3eu/DISmf0CvrPA+DxCzzbYVC/7UmhIOcEiZ3O
IvV3KhII55r1nd+hF+gIUEAZETbwVeOV4aDtrYj6+5ncNaTWN9RPaIIqXK4xy0j3
2Hj/FXTyzyTu6Ze9GSsSnuzGfRTURAy1rMGRnTX4k/w2O0Vld173P+G2VsJWkYrY
53z9ycCjCyfD8k3WgjwnayMkGHQpxqpUuBtoGu6NbME9AXQQHg==
-----END CERTIFICATE REQUEST-----
- El certificado firmado en formato X.509 con la clave pública entre otras cosas: www-asir-com.pem
# cat www-asir-com.crt
-----BEGIN CERTIFICATE-----
MIIFNDCCAxwCCQDoiIAMRkzcqDANBgkqhkiG9w0BAQsFADBcMQswCQYDVQQGEwJF
UzETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
cyBQdHkgTHRkMRUwEwYDVQQDDAxzcmkuYXNpci5jb20wHhcNMjQwMjI4MjI1MDEy
WhcNMjUwMjI3MjI1MDEyWjBcMQswCQYDVQQGEwJFUzETMBEGA1UECAwKU29tZS1T
dGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRUwEwYDVQQD
DAxzcmkuYXNpci5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDT
Xk5d0534pvQsYczvIQpQFKKRIbPK7lWLm4awSe44sgdJ+kd3hAnkDbiOBwPAV9EF
9v00o8xFpjqoO0SaT9DCSDDBjFF/xLRdJC0uyhSayMZD21wVKLh1jNzGFwcfxzCm
5VxtW2IyZx9s6L75FPuPzPWNzP9XKDbjjuHXQ9cL4zzAOqv9zH56Y6hbblSQUA6I
FzrBpRimkPv2ncFXDmlLDWrCkbCRswS5PtE5e9F2mZ9X6Ymo8zdDqqhGKE0mDlIZ
y9wr5GgGKrqR/gQfNcnh0Ub6W6CZ7rQ8CLTgIgKOXHvCNhWjo5oK5RAhIjw5tkc3
+5tuoX2gBiC7LKktvgJsV/Ets27M4kRWF/k15XNyhAcyVOvgn0EqBarFKs2XqyLY
dNo9q4xzIYfu+G0QUndjd9kT0k8/Dl9NnFA55jHfzaBCaQWE6X7qqz9QkoleNu3R
2eph/sbKIP2dLF8HBftEvYfUG0gSYTHzbDOZJjcPN0DC0xe8QnzbaWPDGV+Q5viM
/Lq5bYCOFHnZkdDvUdrztU11QOX52DV6iH93JqictyjzwWwWioGoFQp+PzCVR8sT
PJr2i7RwLkF8keRg/cfjHAjtVVEHeuLL8UeFLP7hb+t1bNGqP5dqdbzcuct1GB19
oW2pVImHKc5Ip5RJtZoonQTomX2WnHsNsFtEVJA6nwIDAQABMA0GCSqGSIb3DQEB
CwUAA4ICAQBAOinJel9/80tpuamcEwT/t6Du3iFWzb7/6JGMq5zbzsfkojr8HAZ9
K0Dq7jCLoZaooo5xL2IpLjGqVSYjSil5oK1BFw8E4AcIAIMo+FAONzwo40yLfRBJ
dv8aKuKMcMTozUh2IagnW/1/00wV4WwcMNhat9fUa82bG1yXw5SRhFsrwYS68EX5
2X/Lqov8pibHOcQMXN+EJFWMDtTObpJYsbZYv9Jjw5U596UYYeyjOGuvMCaJ3gQw
l4vR4y55mEf2dtKpzbnw6/aziXXsW0YN0CDBqax+N18TS/y3CDsXwnM9MVt9kdbu
f/7BEZjd5JW4dLAfVZhStv3eAeGc6/Fav96c8r6eWOVDWB2DHP5y24RtOyN1AH1g
ypHD1hXw2LwqCgS6sMqEqVFHgZWTJ+jjHgm+QZ//x5rg4QU+b/uqE67V+rf0F21g
v/LEG7d3frHUhn6xRAnia0lehF00O9PtRqOJFGGU+LPHY3XHhca/wOWUWTAL5Nbm
fjU7KXiXrS5R1cmEP3wAtWyYICxtYSmsCr4dQulYICaMVezv1sMJu2rStwH8T+kS
b6xXBN4aQ3qo0bi6YBkHufj0W7XUPNH0qGplZt+V9nxafBOHLNumQHl7rJ5mNiy2
CxIVxw3lHisxbQx/T3H8t70xgTYBKCuhUA6s4WXyKwGfIJiz4v2JjQ==
-----END CERTIFICATE-----
La clave privada la debemos colocar en el directorio /etc/ssl/private con el root como dueño, ssl-cert como grupo y 640 como máscara de permiso.
# cp www-asir-com.key /etc/ssl/private
# chown root:ssl-cert /etc/ssl/private/www-asir-com.key
# chmod 640 /etc/ssl/private/www-asir-com.key
Y el certificado hay que ponerlo en el directorio /etc/ssl/certs.
# cp www-asir-com.pem /etc/ssl/certs
Por último, nos queda la configuración de Apache, y esta comienza habilitando el módulo mod_ssl, si no está ya habilitado:
# a2enmod ssl
A continuación, crearemos con la directiva <VirtualHost> la configuración necesaria para que nuestro sitio web, en este caso, www.asir.com, trabaje con el protocolo HTTPS. Para ello nos basaremos en el fichero del sitio por defecto para HTTPS, cuyo nombre es /etc/apache2/sites-available/default-ssl.conf.
# cd /etc/apache2/sites-available/
# cp default-ssl.conf www-asir-com-ssl.conf
El contenido de la directiva <VirtualHost> debería tener al menos lo siguiente:
<VirtualHost *:443>
...
Servername www.asir.com
DocumentRoot /var/www/www-asir-com
...
ErrorLog ${APACHE_LOG_DIR}/www-asir-com-error.log
CustomLog ${APACHE_LOG_DIR}/www-asir-com-access.log combined
...
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/www-asir-com.pem"
SSLCertificateKeyFile "/etc/ssl/private/www-asir-com.key"
...
</VirtualHost>
Nos queda ya activar el sitio seguro:
# a2ensite www-asir-com-ssl
Si queremos que las solicitudes HTTP (http://www.asir.com/...) se conviertan en HTTPS (http://www.asir.com/...), lo que debemos hacer es incluir una redirección permanente en la configuración no segura del sitio (/etc/apache2/sites-available/www-asir-com.conf). Si no hacemos esto, estaremos permitiendo el acceso al sitio web con los dos protocolos, el seguro (HTTPS) y inseguro (HTTP).
Directiva SSLEngine
Sintaxis: SSLEngine {on|off}
Contexto: server config, virtual host
Valor por defecto: off
Esta directiva la utilizaremos para activar o desactivar el proctocolo TLS.
Directiva SSLCertificateFile
Sintaxis: SSLCertificateFile ruta-a-fichero
Contexto: server config, virtual host
La utilizaremos para indicar el certificado con formato X.509 que se utilizará.
Directiva SSLCertificateKeyFile
Sintaxis: SSLCertificateKeyFile ruta-a-fichero
Contexto: server config, virtual host
Indicaremos con esta directiva el fichero donde está la clave privada que se utilizará.