En este tutorial vamos a ver como instalar un certificado SSL totalmente gratuito en Apache de una forma muy fácil ya que lo vamos a hacer en 4 simples pasos.
Este artículo complementa la guía de Cómo Instalar Laravel en Digital Ocean que escribí hace unos días. Ahora toca ver como aplicar HTTPS a nuestra aplicación con un certificado SSL para Apache y así, garantizar a nuestros usuarios seguridad y confiabilidad.
Requisitos para crear Certificado SSL en Apache
Para seguir esta guía debes cumplir algunos requisitos:
- Servidor Ubuntu 18.04 (también sirve para 16.04 y 14.04).
- Tener dominio contratado y configurado en Apache.
- Tener instalado en tu servidor el programa ufw (firewall).
Paso 1: Instalar CertBot
Vamos a utilizar los certificados que nos provee Let’s Encrypt que son totalmente confiables y gratuitos. Para esto instalaremos el programa CertBot en nuestro servidor que nos permite realizar la configuración en Apache de una forma fácil.
Para instalar CertBot, debemos agregar el repositorio a nuestro servidor:
sudo add-apt-repository ppa:certbot/certbot
Luego, actualizamos nuestro servidor:
sudo apt-get update
Y por último, instalamos el paquete de CertBot para Apache:
sudo apt install python-certbot-apache
Listo, ya tenemos CertBot instalado en nuestro servidor. Ahora necesitamos habilitar el firewall para permitir el trafico por HTTPS.
Paso 2: Habilitar HTTPS en el Firewall
Utilizaremos ufw
para habilitar el tráfico HTTPS. Para esto ejecutaremos dos comandos que le permitirán a Apache trabajar con HTTPS:
sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'
Si verificamos el estado de nuestro firewall con el comando sudo ufw status
deberá verse algo así:
Output Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)
Ahora toca ejecutar CertBot y obtener nuestro certificado SSL.
Paso 3: Obtener Certificado SSL para Apache
CertBot es un excelente programa que reconfigura nuestro servidor Apache sin que tengamos que tocar nuestro host virtual. Para esto, debemos ejecutar el siguiente comando:
sudo certbot –apache -d ejemplo.com -d www.ejemplo.com
Con el comando anterior ejecutamos certbot para Apache y con la opción -d
le pasamos como nuestro dominio. Asegúrese que su dominio sea el mismo que ingreso en ServerName
de su host virtual.
Si es la primera vez que ejecutas certbot en su servidor, te pedirá que ingreses una dirección de correo electrónico para la recuperación de claves. Si en tu archivo de host virtual no se especifica el ServerName
, te pedirá que elijas tu archivo de host virtual.
Si todo es correcto, veras el siguiente mensaje donde debes elegir si deseas mantener http junto con https o redirigir todo tu trafico por https. Te recomiendo que ingreses el numero 2 para redirigir todo tu trafico a HTTPS.
Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Presiona ENTER
y la configuración de tu servidor se actualizará. Apache se reiniciara automaticamente y CertBot te mostrará el siguiente mensaje informando que el proceso se realizo con exito:
Output IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/ejemplo.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/ejemplo.com/privkey.pem Your cert will expire on 2018-07-23. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
¡Esto es todo! Tus certificados SSL se descargaron e instalado correctamente. 👏
Si ingresamos a nuestro sitio web ya podemos ver que la url comienza con HTTPS y tenemos el candado que identifica a nuestro sitio como Sitio seguro.
Paso 4: Renovación de certificado SSL
Como estamos utilizando certificados gratuitos, los mismos se vencen cada 90 días. Pero, ¡no te preocupes! porque CertBot instaló automáticamente un script que se ejecuta dos veces por día y verificando si faltan 30 días para que se venza el certificado, si es así lo renovara automáticamente y reiniciara Apache por nosotros. 🧡
Si ejecutamos el siguiente comando y no vemos errores, significa que la renovación automática funciona correctamente.
sudo certbot renew --dry-run
Conclusión
En este tutorial vimos como instalar un certificado SSL gratuito en Apache gracias a Let’s Encrypt y CertBot. Ahora tu aplicación es más segura y profesional. Si te gusto este artículo, házmelo saber en los comentarios y compártelo en tus redes sociales. Nos vemos en la próxima. 😉🤙
Estimado Matías, hace un par de meses instalé el certificado en Apache con Let’s Encrypt. Pese a que instalé certbot para la renovación automática, ayer me llega un mail solicitando renovación, el que incluía algo como:
Your Let’s Encrypt client used ACME TLS-SNI-01 domain validation to issue
a certificate in the past 60 days. Below is a list of names and IP
addresses validated (max of one per account):
http://www.midominio.com (mi_IP) on 2019-01-17
http://www.midominio.com (mi_IP) on 2019-01-17
TLS-SNI-01 validation is reaching end-of-life. It will stop working
temporarily on February 13th, 2019, and permanently on March 13th, 2019.
Any certificates issued before then will continue to work for 90 days
after their issuance date.
Entiendo que deshabilitan TSL, pero como gran novato, no tengo idea de qué hacer. Te agradecería cualquier dato, un abrazo!
Como estas Jose? Una consulta, en donde contrataste tu dominio y que de donde es tu servidor?
Gracias por la respuesta. El dominio lo contraté con Wiroos y el server es un Droplet de Digital Ocean, Ubuntu 16.04, la versión instalada de certbot es 0.26.1
Si parece que Let’s Encrypt deshabilito el protocolo TLS-SNI-01 y recomienda pasar al protocolo HTTP-01. Para hacerlo, lo podes hacer con el comando:
Como dice Apache, «it works!», nada más tuve que actualizar elcertbot primero. Gracias Matías.
Estimado Matias, yo estoy tratando de hacer los mismo pero en un servidor en amazon, tengo un servidor ubuntu 16.04 y al ejecutar el comando sudo certbot –apache -d ejemplo.com -d http://www.ejemplo.com (Obviamente con mis dominios)
me sale el siguie error:
usage:
certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] …
Certbot can obtain and install HTTPS/TLS/SSL certificates. By default,
it will attempt to use a webserver both for obtaining and installing the
certificate.
certbot: error: unrecognized arguments: –apache
Quisiera saber como soluciono eso, de antemano muchas gracias
Cómo estas Jonathan? Según el comando que pusiste estas poniendo un solo guion en «apache». Debes poner dos guiones de esta forma: –apache
Si igualmente no funciona, ¿instalaste el paquete de CertBot para Apache? (es el tercer comando que pongo en el artículo)
Gracias Matías! Muy buen tutorial! Tengo un problema, seguí todos los pasos que indicas y pude obtener el certificado SSL, es más cuando trato de entrar al dominio, me redirige automáticamente al https, el problema es que ya mi página no carga más y me da el siguiente mensaje:
Esta página no funciona
(Mi página web) te redireccionó demasiadas veces.
Intenta borrar tus cookies.
ERR_TOO_MANY_REDIRECTS
El dominio lo tengo en godaddy y el servidor es un droplet de digitalocean, el sistema que instale es el vtiger.
Crees que deba configurar adicionalmente algo en el virtual host o que me falte algún paso adicional para que funcione todo como antes de instalar el SSL? (que antes de eso funcionaba al 100%)
Puede ser por varias cosas pero prueba poner este código en tu AppServiceProvider.php.
if(env(‘ APP_ENV’) !== ‘local’) { $url->forceSchema(‘https’); }
Si no, revisa bien tu configuración de apache o alguna redirección que tengas en tus middleware.
Matías, El appserviceprovider.php no es exclusivo de laravel? no uso laravel 🙁 No tengo mucho conocimiento en linux pero estoy tratando de buscar algun error que haya podido hacer, quizá en el .htaccess
Ah si, perdón. La verdad que no se entonces que te debe estar provocando el bucle de redirecciones.
Gracias !
Buenisimo tutorial, sigan asi <3
Estimado Matías, quiero agradecerte por este buen tutorial que te has tomado el tiempo de realizar. Tengo una consulta, si deseo aplicar el certificado SSL a mi dominio principal (ejemplo.com) y subdominios de clientes (sub1.ejemplo.com, sub2.ejemplo.com, sub3.ejemplo.com) qué comandos debería usar para instalar Certbot y que pudiera aplicarse al dominio y subdominios que existen y que pudieran existir en el futuro? Saludos y gracias de antemano.
Hola Carlos, como estas?
Podrías registrar los dominios con wildcard. El comando creo que es así:
$ certbot certonly --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory --manual-public-ip-logging-ok -d '*.' -d
No estoy del todo seguro, cualquier cosa dale una googleada a «Certbort wildcard».
Muchas gracias por tu comentario.
Saludos.
Hola Matías, quería comentarte que pude instalar el certificado Wildcard con el comando:
sudo certbot certonly –manual -d *.example.com -d example.com –agree-tos –no-bootstrap –manual-public-ip-logging-ok –preferred-challenges dns-01 –server https://acme-v02.api.letsencrypt.org/directory
He llegado a recibir el «Congratulations» del certificado, sin embargo la página sigue sin cargar en HTTPS. En uno de los Post que revisé me dicen que debo configurar manualmente el Virtual Host, pero lo he intentado y no logro hacer que cargue en HTTPS. Te dejo el Post que usé de referencia: https://medium.com/@lakin.mohapatra/generate-lets-encrypt-free-wildcard-certificate-on-ubuntu-18-dcf26f458e13
Te agradecería que pudieras ayudarme.
Buenas noches, tengo este problema que no logro resolver.
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: ejemplo.com.ar
Type: None
Detail: DNS problem: SERVFAIL looking up A for ejemplo.com.ar – the
domain’s nameservers may be malfunctioning