Redirigir las peticiones HTTP a HTTPS en Apache

Aquí se muestra la configuración de VirtualHost para que toda petición HTTP sea redirigida a HTTPS:

Cómo comprar un certificado SSL

Para que no se me olvide a mí mismo, en namecheap.com venden certificados baratos para páginas web. Lo primero que hay que elegir es cuántos dominios queremos que abarque:

  • Single Domain: un único dominio como por ejemplo www.foo.com o blabla.foo.com.
  • Multiple Domain: hasta 3 dominios de los anteriores, por cuestiones de que salgan más baratos.
  • Wildcard: Cubre todos los subdominios de un dominio *.foo.com.

Adicionalmente, hay que elegir qué nivel de certificación queremos entre:

  • Domain Validation (DV): Es más barato. Simplemente certifica que el dominio es el que dice ser. Para páginas personales que queremos que utilicen https.
  • Organization Validation (OV): Piden más información para certificar que la empresa que está detraś es la que dice ser.
  • Extended Validation (EV): La más cara y en la que piden más datos y realizan más validaciones antes de concederte el certificado, hace que en la barra del navegador aparezca la empresa en color verde.

Los pasos para obtener un certificado wildcard en namecheap son:

1.- Comprar el certificado (en mi caso Domain Validation Wildcard), indicado si es para configurar Apache, Tomcat u otro. Apache en este caso de ejemplo.

2.- Generar un CSR (Certificate Signing Request) de Apache:

En el caso de certificados para dominios wildcard:
Common Name: *.dominio.com
Password: un valor vacío.
Company name: un valor vacío.
Organization Name: NA
Organizational Unit Name: NA

(un poco más de información en la página de namecheap sobre CSR para Apache)

Después copiar el contenido del CSR a la web de namecheap en un formulario (uno de los pasos tras para comprar el certificado). Y copiar el .key a etc/apache2/certs o /etc/ssl, por ejemplo, porque lo necesitaremo más adelante.

3.- Seleccionar el modo de validación que posee el dominio. con esto namecheap podrá comprobar que, efectivamente, somos dueños del dominio. Existe validación por http, DNS y por email. En mi caso lo realicé mediante validación por correo. Al comprar el dominio configuré que todo el correo que llegue a admin@dominio.com sea redireccionado a mi correo personal.

4.- Indicar la dirección de correo a la que enviarán un .zip con el fichero de certificado .crt y un fichero “bundle” .ca-bundle para configurar Apache.

5.- En la cuenta de correo admin@dominio.com (o la indicada) llegará el correo de validación que se trata de introducir un código en una URL indicada.

6.- Nos llegará el fichero .zip con el fichero de certificado .crt y un fichero “bundle” .ca-bundle para configurar Apache que copiaremos al servidor (en /etc/apache2/certs o /etc/ssl por ejemplo).

7.- Activar mod_ssl de Apache: a2enmod mod_ssl.

8.- Configurar los virtualhosts para que utilicen el certificado:

9.- Reiniciar Apache: service apache2 restart

Cómo configurar HTTPS en Tomcat 7

Lo primero es comprar un dominio y hacer que apunte al servidor (no indicados los pasos aquí).

Crear el certificado con Certbot.

Puede que certbot de el error ImportError: No module named cryptography.hazmat.bindings.openssl.binding.

Copiamos el .pfx generado a la carpeta de Tomcat y le damos permisos para que Tomcat lo pueda leer:

Configuramos Tomcat para que use el certificado SSL, en /etc/tomcat7/server.xml

Configuramos el sistema para que las peticiones a los puertos 80 y 443 los sirva el servidor escuchando en los puertos 8080 y8443. Yo lo pongo en /etc/init.d/tomcat7 en los comandos ‘start’ y ‘stop’:

Configurar Tomcat para que sólo acepte conexiones HTTPS en /etc/tomcat7/web.xml . Añadir dentro del contenido del tag <web-app> :

Configurar el conector HTTP en  /etc/tomcat7/server.xml  para que redireccione al puerto 443 (no al 8443), de manera que todas las peticiones HTTP serán redireccionadas a HTTPS:

Resumen de la creación del certificado

Este es el script para crear el certificado:

Configurar la renovación automática del certificado

Añadimos la siguiente línea a /etc/crontab  para que se ejecute cada 2 meses (dado que el certificado dura 3):

O también se puede ejecutar a mano como root  cuando nos llegue el correo recordatorio de que el certificado va a expirar: