Implementar https de let’s encrypt en Apache con Certbot

Logo de Let's Encrypt

Explicarei cómo instalar o certificado ssl de let’s encrypt dunha maneira interactiva usando o script de Certbot, en apache.


Sobre let’s encrypt

O proxecto let’s encrypt, ten como obxetivo que tódalas webs poidan usar https de maneira gratuita, pois a súa fundación fai de compañía certificadora válida, é un proxecto respaldado pola linux fundation que se finanza con doacións, polo que permite ter un certificado gratuitamente o cal é un bo motivo pra donarlles unha cantidade que axude a mantelo proxecto que inda así nos saldría moito máis barata que contratar o certificado con unha empresa privada.

Para máis información: https://letsencrypt.org.

No noso caso, temos acceso ssh ao servidor e usarémolo cliente Cerbot que se encargará de xestionalo certificado, o cal terá unha valided duns 90 días, que logo renovará automáticamente.

Aquí tedes máis detalles sobre as diferentes instalacións: https://letsencrypt.org/getting-started/

Instalación dos paquetes en Debian

Accedemos a web: https://certbot.eff.org/

E alí seleccionamos o software que usamos pra servir páxinas webs, neste caso Apache, e o sistema operativo Debian 9.

Configurando os repositorios de Debian

No caso de Debian, precisamos engadir os repositorios “backports”, estos repositorios conteñen paquetes da versión testing na súa maioría e algúns de unestable, e permiten a instalación de ditos paquetes nunha versión de Debian estable, mais non foron probados a fondo pra garantir que sexan estables polo que hai que ter coidado cando se usan.

Engadindo os repositorios backports a /etc/apt/sources.list

Os paquetes de backports só se instalan cando se solicita expresamente no comando apt-get, e son actualizados do mesmo xeito que os outros, mais non interferirán con paquetes estables volvendo a estos “testing”. E así podemos usar paquetes máis “modernos” sen interferir cos antigos e estables.

Editamos /etc/apt/sources.list e engadimos a liña do repositorio:
# ...
deb http://ftp.debian.org/debian stretch-backports main
# ...

Instalando certbot

Seguindo coas instruccións de Cerbot unha vez temos agregados os repositorios backports.

Procedemos a instalación dos paquetes necesarios pra certbot:
sudo apt-get install python-certbot-apache -t stretch-backports
Logo de buscalo no repo de backports, nos dirá de instalar todo isto:
...
The following NEW packages will be installed:
  augeas-lenses certbot libaugeas0 python-certbot-apache python-pyicu python3-acme python3-augeas
  python3-certbot python3-certbot-apache python3-cffi-backend python3-configargparse python3-configobj
  python3-cryptography python3-future python3-idna python3-josepy python3-mock python3-openssl
  python3-parsedatetime python3-pbr python3-pyasn1 python3-rfc3339 python3-setuptools python3-tz
  python3-zope.component python3-zope.event python3-zope.hookable python3-zope.interface
0 upgraded, 28 newly installed, 0 to remove and 29 not upgraded.
Need to get 2,590 kB of archives.
After this operation, 12.4 MB of additional disk space will be used.
Do you want to continue? [Y/n] 

Decímoslle que si, e instalamos.


Uso de Cerbot

O plugin de Cerbot pra Apache http, está nun estado de beta-sólida, vamos que non cho poden asegurar de todo, mais está ben probado, e permite a automatización da instalación dos certificados.

Configuración automática para o noso dominio

O comando pra configurar automáticamente o noso hospedaxe pra admitir certificados sería:
sudo certbot --authenticator webroot --installer apache

Sendo webroot o nome do plugin usado pra autentificación ( vamos non hai que mudalo ).

Logo nos informará de que crea o directorio e arquivo de log de letsencrypt, e preguntará por un email ao que informar sobre a renovación do certificado ou temas de seguridade:
# sudo certbot --authenticator webroot --installer apacheSaving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): 

Podemos poñelo ou cancelar, mais é recomendable que nos avise ou podemos toparnos con que a nosa web non ten un certificado https válido afectando a súa confiabilidade.

A continuación nos amosará as urls dos termos e condicións de uso do servizo, e preguntará se queremos aceptalos:
...
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: 
Logo nos preguntará se estamos dispostos a compartir o noso email coa EFF, pra enviarnos emails sobre a EFF e o seu traballo no cifrado da web, protección aos seus usuarios e a defensa dos seus dereitos dixitáis:
...
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: 
Despóis nos preguntan pra que nomes queremos activalo https, os colle da configuración do host virtual:
...
Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: blog.deliodc.com
2: blog.deliodc.local
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1

No meu caso escribín 1, pois o rematado en .local era un serveralias de probas.

Nos vai a indicar que se obtivo o novo certificado e as mudanzas que son necesarias realizar, ademáis de preguntar pola raiz da web do dominio:
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for blog.deliodc.com
Input the webroot for blog.deliodc.com: (Enter 'c' to cancel): 

Ahí se lle pon a ruta ao directorio raíz da web que servimos, como pode ser /var/www/deliodc.

Supoño que meten un arquivo de verificación nel que será accedido dende fora do noso servidor.

Depóis de amosarnos as mudanzas no sistema que realizou pra instalación do certificado, nos preguntará se queremos habilitar o redireccionado a https por defecto:
...
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/blog-deliodc-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate for blog.deliodc.com to VirtualHost /etc/apache2/sites-available/blog-deliodc-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/blog-deliodc-le-ssl.conf

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): 

No meu caso xa tiña montado o sitio, mais inda así seleccionei a opción 2 pra ver cómo se comporta.

Podemos ver que implementa a mudanza no arquivo de configuración e nos advirte de que o revisemos:
Added an HTTP->HTTPS rewrite in addition to other RewriteRules; you may wish to check for overall consistency.
Redirecting vhost in /etc/apache2/sites-enabled/blog-deliodc.conf to ssl vhost in /etc/apache2/sites-available/blog-deliodc-le-ssl.conf

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled https://blog.deliodc.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=blog.deliodc.com
-------------------------------------------------------------------------------

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/blog.deliodc.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/blog.deliodc.com/privkey.pem
   Your cert will expire on 2018-05-20. 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

E con isto estaría listo a instalación do certificado https e a configuración do mesmo, podes probar o resultado accedendo a [https://blog.deliodc.com](https://blog.deliodc.com].


Renovar un certificado

Esta parte estaba por poñela nun novo post, cando me toque renovar, mais vouna engadir aquí por se che fai falta.

Tal como nos indican deberemos executalo comando:

To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option.

Coa opción “certonly”.

Certbot renew

Como podremos ver está todo moi automatizado e apenas hai perda cando se sabe que comandos executar.

Actualizalo certificado, sería algo así:
sudo certbot renew

Unha vez comprobado que funciona, o podremos engadir como unha tarefa automática do cron que se execute cada 3 meses. De tódolos xeitos nos avisarán por email se o indicamos, e non teremos máis que executar ese comando a man.

Comentarios sobre este método de certificación

O bó que ten o uso do automatizado de Certbot, é que sempre tratará de actualizar ao último en seguridade SSL que sexa viable ter, polo tanto sempre teremos garantido unha conexión segura moderna, xa que cada 3 meses nos irá avisando da necesidade de actualización do mesmo e coa execución do comando de renovado se actualizará todo.

Como podemos ver na url do reporte sobre o estado do SSL, dan unha boa puntuación:

Resultado da proba do ssl de https://deliodc.com en Qualys.

Consellos finais

Erros 403

Estos se producen cando non se ten permiso de acceso a “tal” directorio da web.

No meu caso no arquivo de configuración teño declara unha variable que apunta ao directorio raíz da web, pra non ter que estar a repetilo na configuración e que queda fora da directiva VirtualHost, polo que me deu un erro 403 ao tratar de acceder, xa que en DocumentRoot aparece o uso de dita variable ${FULL_PATH} a cal non se define no arquivo cargado, mais engadindo a definición, a configuración me funciona perfectamente.

Redirixilo tráfico http a https

Engado esta sección por se estás interesado en que os que conecten por http, automáticamente sexan levados ao servidor https.

En Apache non tes máis que engadir o seguinte dentro do teu host virtual:
<VirtualHost *:80>
  Redirect / https://blog.deliodc.com/
  # Resto das liñas de configuración do host virtual
</VirtualHost>

Sendo que todo o solicitado dende a raíz web / deste host virtual, será redirixido a url indicada no meu caso a do meu blog en https.