Gitlab Pages con TLS y Letsencrypt

6 minutos de lectura

Gitlab posee su propio certificado TLS para los proyectos alojados en sus servidores, pero puede darse el caso de que tengas alojado tu blog en Gitlab Pages, el cual estará bajo un dominio tipo usuario.gitlab.io, y quieras tener tu propio dominio .com con un certificado TLS.

Como he dicho el certificado que proporciona Gitlab solo es valido para dominios tipo usuario.gitlab.io por lo que nos serviremos de Letsencrypt añadir un certificado TLS para nuestro dominio. Por si aun no lo sabias, Letsencrypt es una entidad certificadora que nos proporciona de forma gratuita certificados X.509 para el cifrado TLS,

Esta guía la voy a realizar sobre un blog construido en Jekyll sobre Gitlab Pages, imagino que los pasos para otro tipo de blog o sitio deben de ser muy parecidos.

Una vez que tengas tu dominio debemos de hacer dos cosas:

  • Añadir el dominio a Gitlab Pages
  • Añadir el certificado a nuestro sitio web

Añadir nuestro dominio a Gitlab Pages

Pulsamos en Settings -> Pages

New Domain

En Domain ponemos el nombre del nuevo dominio

A partir de este momento nuestro sitio será accesible desde dos sitios http://tu.dominio y desde https://tunombre.gitlab.io.

Añadir el certificado a nuestro sitio web

Para poder obtener nuestro certificado de Letsencrypt vamos a necesitar de la utilidad certbot, en arch linux lo instalaremos junto con las dependencias necesarias con :

1sudo pacman -S certbot

Como las páginas están en los servidores de GitLab debemos hacerlo de forma manual

1sudo certbot certonly -a manual -d TU.DOMINIO

Ponemos la dirección de correo electrónico,

1
2Saving debug log to /var/log/letsencrypt/letsencrypt.log
3Plugins selected: Authenticator manual, Installer None
4Enter email address (used for urgent renewal and security notices) (Enter 'c' to
5cancel): TU@CORREO

Aceptamos los términos del servicio

1
2-------------------------------------------------------------------------------
3Please read the Terms of Service at
4https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
5agree in order to register with the ACME server at
6https://acme-v01.api.letsencrypt.org/directory
7-------------------------------------------------------------------------------
8(A)gree/(C)ancel: a

Debemos de elegir si queremos compartir nuestra dirección de correo electrónico

1-------------------------------------------------------------------------------
2Would you be willing to share your email address with the Electronic Frontier
3Foundation, a founding partner of the Let's Encrypt project and the non-profit
4organization that develops Certbot? We'd like to send you email about EFF and
5our work to encrypt the web, protect its users and defend digital rights.
6-------------------------------------------------------------------------------
7(Y)es/(N)o: y

Ahora comienza el proceso de solicitud del nuevo certificado

1Obtaining a new certificate
2Performing the following challenges:
3http-01 challenge for TU.DOMINIO

Como estamos solicitando el certificado de forma manual, seleccionamos Y

1-------------------------------------------------------------------------------
2NOTE: The IP of this machine will be publicly logged as having requested this
3certificate. If you're running certbot in manual mode on a machine that is not
4your server, please ensure you're okay with that.
5
6Are you OK with your IP being logged?
7-------------------------------------------------------------------------------
8(Y)es/(N)o: y

Cuando lleguemos al paso de más abajo, paramos, y en el la raíz de nuestro sitio web debemos crear el fichero con el contenido que nos pide. Hasta que no tengamos creado el fichero y hayamos comprobado que el fichero es accesible, no debemos de pulsar la tecla Enter para continuar

 1-------------------------------------------------------------------------------
 2Create a file containing just this data:
 3
 45xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4.pW4MAhlax4MNFqsdfXOVe9PMr_5LsdfLNIdhgHA_eNs
 5
 6And make it available on your web server at this URL:
 7
 8http://TU.DOMINIO/.well-known/acme-challenge/5xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4
 9
10-------------------------------------------------------------------------------
11Press Enter to Continue

Si leemos la información, nos pide que creemos un fichero llamado 5xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4, y peguemos en su interior el texto 5xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4.pW4MAhlax4MNFqsdfXOVe9PMr_5LsdfLNIdhgHA_eNs

Así que en la raíz de nuestro sitio web creamos el fichero llamado 5xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4 y en su interior ponemos:

1---
2layout: null
3permalink: /.well-known/acme-challenge/5xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4
4---
5
65xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4.pW4MAhlax4MNFqsdfXOVe9PMr_5LsdfLNIdhgHA_eNs

Comprobamos que funciona

1curl http://TU.DOMINIO/.well-known/acme-challenge/5xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4
2
35xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzo_Wa4.pW4MAhlax4MNFqsdfXOVe9PMr_5LsdfLNIdhgHA_eNs

Si todo ha ido bien, nos debe de devolver el contenido del fichero quue hemos creado 5xVJtje7BgkOpMNSqDk-OiavoEcTrlZIAYfVvzoWa4.pW4MAhlax4MNFqsdfXOVe9PMr5LsdfLNIdhgHA_eNs

Ya podemos volver a la terminal y pulsar en la tecla Enter para continuar

 1Press Enter to Continue
 2Waiting for verification...
 3Cleaning up challenges
 4
 5IMPORTANT NOTES:
 6 - Congratulations! Your certificate and chain have been saved at:
 7   /etc/letsencrypt/live/TU.DOMINIO/fullchain.pem
 8   Your key file has been saved at:
 9   /etc/letsencrypt/live/TU.DOMINIO/privkey.pem
10   Your cert will expire on 2018-04-13. To obtain a new or tweaked
11   version of this certificate in the future, simply run certbot
12   again. To non-interactively renew *all* of your certificates, run
13   "certbot renew"
14 - If you like Certbot, please consider supporting our work by:
15
16   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
17   Donating to EFF:                    https://eff.org/donate-le

Como hemos solicitado el certificado usando la opción manual, los certificados se guardaran en /etc/letsencrypt/live de nuestro ordenador, en un próximo articulo veremos como hacer un backup de esos certificados y la forma de restaurarlos.

Para terminar necesitamos subir los certificados a GitLab

En nuestro proyecto vamos a Settings -> Pages y copiamos el contenido de /etc/letsencrypt/live/TU.DOMINIO/fullchain.pem en el campo “Certificate (PEM)" y /etc/letsencrypt/live/TU.DOMINIO/privkey.pem en el campo “Key (PEM)", necesitaras utilizar sudo para poder leer el contenido de los ficheros.

Cuando hayamos terminado podemos comprobar que funciona

 1curl -vX HEAD https://TU.DOMINIO/
 2
 3Warning: Setting custom HTTP method to HEAD with -X/--request may not work the
 4Warning: way you want. Consider using -I/--head instead.
 5*   Trying 52.167.214.3...
 6* TCP_NODELAY set
 7* Connected to TU.DOMINIO (52.167.214.3) port 443 (#0)
 8* ALPN, offering h2
 9* ALPN, offering http/1.1
10* successfully set certificate verify locations:
11*   CAfile: /etc/ssl/certs/ca-certificates.crt
12  CApath: none
13* TLSv1.2 (OUT), TLS handshake, Client hello (1):
14* TLSv1.2 (IN), TLS handshake, Server hello (2):
15* TLSv1.2 (IN), TLS handshake, Certificate (11):
16* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
17* TLSv1.2 (IN), TLS handshake, Server finished (14):
18* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
19* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
20* TLSv1.2 (OUT), TLS handshake, Finished (20):
21* TLSv1.2 (IN), TLS handshake, Finished (20):
22* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
23* ALPN, server accepted to use h2
24* Server certificate:
25*  subject: CN=TU.DOMINIO
26*  start date: Jan 13 22:43:11 2018 GMT
27*  expire date: Apr 13 22:43:11 2018 GMT
28*  subjectAltName: host "TU.DOMINIO" matched cert's "TU.DOMINIO"
29*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
30*  SSL certificate verify ok.
31* Using HTTP2, server supports multi-use
32* Connection state changed (HTTP/2 confirmed)
33* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
34* Using Stream ID: 1 (easy handle 0x5612c569c160)
35> HEAD / HTTP/2
36> Host: TU.DOMINIO
37> User-Agent: curl/7.57.0
38> Accept: */*
39>
40* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
41< HTTP/2 200
42< accept-ranges: bytes
43< cache-control: max-age=600
44< content-type: text/html; charset=utf-8
45< expires: Mon, 22 Jan 2018 23:02:58 UTC
46< last-modified: Sat, 13 Jan 2018 23:40:45 GMT
47< vary: Origin
48< content-length: 88393
49< date: Mon, 22 Jan 2018 22:52:58 GMT
50<
51* transfer closed with 88393 bytes remaining to read
52* Closing connection 0
53* TLSv1.2 (OUT), TLS alert, Client hello (1):
54curl: (18) transfer closed with 88393 bytes remaining to read

Ahora ya puedes acceder a tu dominio desde una dirección https

Recuerda que al haber solicitado el certificado con la opción manual cuando tengas que renovar el certificado no podrás usar la opción renew y deberás hacerlo otra vez con la opcion manual

Referencias: