summaryrefslogtreecommitdiff
path: root/doc/user/project/pages/lets_encrypt_for_gitlab_pages.md
blob: 5ad500c4d20dceb7cb33833c76f9946c826f8717 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
---
description: "How to secure GitLab Pages websites with Let's Encrypt."
---

# Let's Encrypt for GitLab Pages

If you have a GitLab Pages website served under your own domain,
you might want to secure it with a SSL/TSL certificate.

[Let's Encrypt](https://letsencrypt.org) is a free, automated, and
open source Certificate Authority.

## Requirements

To follow along with this tutorial, we assume you already have:

- Created a [project](getting_started_part_two.md) in GitLab which
  contains your website's source code.
- Acquired a domain (`example.com`) and added a [DNS entry](getting_started_part_three.md#dns-records)
  pointing it to your Pages website.
- [Added your domain to your Pages project](getting_started_part_three.md#add-your-custom-domain-to-gitlab-pages-settings)
  and verified your ownership.
- Cloned your project into your computer.
- Your website up and running, served under HTTP protocol at `http://example.com`.

## Obtaining a Let's Encrypt certificate

Once you have the requirements addressed, follow the instructions
below to learn how to obtain the certificate.

NOTE: **Note:**
The instructions below were tested on macOS Mojave. For other
operating systems the steps might be slightly different. Follow the
[CertBot instructions](https://certbot.eff.org/) according to your OS.

1. On your computer, open a terminal and navigate to your repository's
  root directory:

    ```bash
    cd path/to/dir
    ```

1. Install CertBot (the tool Let's Encrypt uses to issue certificates):

    ```bash
    brew install certbot
    ```

1. Request a certificate for your domain (`example.com`) and
  provide an email account (`your@email.com`) to receive notifications:

    ```bash
    sudo certbot certonly -a manual -d example.com --email your@email.com
    ```

    Alternatively, you can register without adding an e-mail account,
    but you won't be notified about the certificate expiration's date:

    ```bash
    sudo certbot certonly -a manual -d example.com --register-unsafely-without-email
    ```

    TIP: **Tip:**
    Read through CertBot's documentation on their
    [command line options](https://certbot.eff.org/docs/using.html#certbot-command-line-options).

1. You'll be prompted with a message to agree with their terms.
  Press `A` to agree and `Y` to let they log your IP.

    CertBot will then prompt you with the following message:

    ```bash
    Create a file containing just this data:

    Rxnv6WKo95hsuLVX3osmT6LgmzsJKSaK9htlPToohOP.HUGNKk82jlsmOOfphlt8Jy69iuglsn095nxOMH9j3Yb

    And make it available on your web server at this URL:

    http://example.com/.well-known/acme-challenge/Rxnv6WKo95hsuLVX3osmT6LgmzsJKSaK9htlPToohOP

    Press Enter to Continue
    ```

1. **Do not press Enter yet.** Let's Encrypt will need to verify your
  domain ownership before issuing the certificate. To do so, create 3
  consecutive directories under your website's root:
  `/.well-known/acme-challenge/Rxnv6WKo95hsuLVX3osmT6LgmzsJKSaK9htlPToohOP/`
  and add to the last folder an `index.html` file containing the content
  referred on the previous prompt message:

    ```bash
    Rxnv6WKo95hsuLVX3osmT6LgmzsJKSaK9htlPToohOP.HUGNKk82jlsmOOfphlt8Jy69iuglsn095nxOMH9j3Yb
    ```

    Note that this file needs to be accessed under
    `http://example.com/.well-known/acme-challenge/Rxnv6WKo95hsuLVX3osmT6LgmzsJKSaK9htlPToohOP`
    to allow Let's Encrypt to verify the ownership of your domain,
    therefore, it needs to be part of the website content under the
    repo's [`public`](index.md#how-it-works) folder.

1. Add, commit, and push the file into your repo in GitLab. Once the pipeline
  passes, press **Enter** on your terminal to continue issuing your
  certificate. CertBot will then prompt you with the following message:

    ```bash
    Waiting for verification...
    Cleaning up challenges

    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at:
       /etc/letsencrypt/live/example.com/fullchain.pem
       Your key file has been saved at:
       /etc/letsencrypt/live/example.com/privkey.pem
       Your cert will expire on 2019-03-12. To obtain a new or tweaked
       version of this certificate in the future, simply run certbot
       again. To non-interactively renew *all* of your certificates, run
       "certbot renew"
     - 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
    ```

## Add your certificate to GitLab Pages

Now that your certificate has been issued, let's add it to your Pages site:

1. Back at GitLab, navigate to your project's **Settings > Pages**,
  find your domain and click **Details** and **Edit** to add your certificate.
1. From your terminal, copy and paste the certificate into the first field
  **Certificate (PEM)**:

    ```bash
    sudo cat /etc/letsencrypt/live/example.com/fullchain.pem | pbcopy
    ```

1. Copy and paste the private key into the second field **Key (PEM)**:

    ```bash
    sudo cat /etc/letsencrypt/live/example.com/privkey.pem | pbcopy
    ```

1. Click **Save changes** to apply them to your website.
1. Wait a few minutes for DNS propagation.
1. Visit your website at `https://example.com`.

To force `https` connections on your site, navigate to your
project's **Settings > Pages** and check **Force domains with SSL
certificates to use HTTPS**.

## Renewal

Let's Encrypt certificates expire every 90 days and you'll have to
renew them periodically. To renew all your certificates at once, run:

```bash
sudo certbot renew
```