How To Secure Nginx with Let's Encrypt on Ubuntu 18.04

Background:

Let's Encrypt is a Certificate Authority (CA) that enables encrypted HTTPS on web servers by allowing users to obtain and install free TLS/SSL certificates. It simplifies the procedure by offering Certbot, a software client that tries to automate the majority (if not all) of the essential stages. On both Apache and Nginx, the entire process of getting and installing a certificate is currently totally automated.

In this guide, you'll learn how to get a free SSL certificate for Nginx on Ubuntu 18.04 and set it up to renew automatically using Certbot.

Instead of using the default Nginx server block file, this tutorial will use a different file. For each domain, we recommend building new Nginx server block files because it helps to avoid frequent errors.

 

What you need:

To follow this tutorial, you will need:

  • One Ubuntu 18.04 server set up , including a sudo non-root user and a firewall.

  • A fully registered domain name. This tutorial will use your_domain throughout. You can purchase a domain name on Listed Hosting, or use the domain registrar of your choice.

  • Both of the following DNS records set up for your server. 

    • An A record with your_domain pointing to your server’s public IP address.
    • An A record with www.your_domain pointing to your server’s public IP address.
  • Nginx installed. Be sure that you have a server block for your domain. Again, this tutorial will use /etc/nginx/sites-available/your_domain as an example.

1 — Installing Certbot

Installing the Certbot software on your server is the first step in using Let's Encrypt to obtain an SSL certificate.

Most users should install Certbot using snap, a package manager created by Canonical (the company behind Ubuntu) and currently accessible on many Linux distributions:

sudo snap install --classic certbot

Your output will display the current version of Certbot and successful installation:

Output certbot 1.21.0 from Certbot Project (certbot-eff✓) installed
Create a symbolic link from the /usr/bin/ directory to the freshly installed /snap/bin/certbot program. This ensures that the certbot command can be successfully executed on your server. Run the ln command to accomplish this. This section includes the -s flag, which creates a symbolic or soft connection rather than a hard link:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Certbot is now ready to use, but in order for it to configure SSL for Nginx, you need to verify some of Nginx’s configuration.

2 — Confirming Nginx’s Configuration

Certbot must be able to locate the relevant server block in your Nginx setup in order to configure SSL automatically. It does this by looking for a server name directive that matches the domain for which you're requesting a certificate.

If you followed the suggested server block setup step in the Nginx installation instruction, you should have a server block for your domain at /etc/nginx/sites-available/your domain with the server name directive set correctly.

To check, use nano or your favorite text editor to access the server block file for your domain:

sudo nano /etc/nginx/sites-available/your_domain

Look for the server name line that already exists. This is what it should look like:

...
server_name your_domain www.your_domain;
...

If this is the case, close your editor and proceed to the next step.

If it doesn't, make the necessary changes. After that, save the file and exit the editor. If you're using nano, press CTRL + X, then Y, then ENTER to do so.

Check the syntax of your configuration changes now:

sudo nginx -t

If you get an error, reopen the server block file and check for any typos or missing characters. Once your configuration file’s syntax is correct, reload Nginx to load the new configuration:

sudo systemctl reload nginx

Certbot can now locate and update the correct server block.

The firewall will then be updated to enable HTTPS traffic.

3 — Allowing HTTPS Through the Firewall

You'll need to adjust the settings to allow HTTPS traffic if you have the ufw firewall enabled, as recommended by the prerequisite guides. Fortunately, Nginx automatically registers a few profiles with ufw when it is installed.

Run the following command to see what the current setting is:

sudo ufw status

You should receive output like this, indicating that only HTTP traffic is allowed to the webserver:

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

To let in additional HTTPS traffic, allow the Nginx Full profile and delete the redundant Nginx HTTP profile allowance:

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Now when you run the ufw status command it will reflect these new rules:

sudo ufw status
Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Next, you’ll run Certbot and fetch your certificates.

4 — Obtaining an SSL Certificate

Certbot offers a number of plugins that can be used to obtain SSL certificates. The Nginx plugin will take care of reloading the configuration and reconfiguring Nginx as needed. Run the following commands to activate this plugin:

sudo certbot --nginx -d your_domain -d your_domain

This runs certbot with the --nginx plugin, using -d to specify the names you’d like the certificate to be valid for.

If this is your first time running certbot, you will be prompted to enter an email address and agree to the terms of service. After doing so, certbot will communicate with the Let’s Encrypt server to request a certificate for your domain. If successful, you will receive the following output:

Output

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-01-27.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for your_domain to /etc/nginx/sites-enabled/your_domain
Successfully deployed certificate for www.your_domain to /etc/nginx/sites-enabled/your_domain
Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

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


Your certificates are downloaded, installed, and loaded. Try reloading your website using https:// and notice your browser’s security indicator. It should indicate that the site is properly secured, usually with a green lock icon. If you test your server using the SSL Labs Server Test, it will get an A grade.

Now that you’ve obtained your SSL certificate, the final step is to test the renewal process.

5 — Verifying Certbot Auto-Renewal

The certificates issued by Let's Encrypt are only valid for ninety days. This is to encourage users to automate the renewal of their certificates. By adding a renew script to /etc/cron.d, the certbot package you installed takes care of this. This script runs twice a day and will renew any certificate that is about to expire in the next thirty days.

You can do a dry run with certbot to test the renewal process:

sudo certbot renew --dry-run

You're good to go if you don't get any errors. Certbot will renew your certificates as needed and reload Nginx to reflect the changes.
If the automated renewal procedure fails, Let's Encrypt will send you an email notifying you that your certificate is about to expire,
using the email address you provided.

Conclusion

Installing the Let's Encrypt client certbot, downloading SSL certificates for your domain, configuring Nginx to use these certificates, and setting up automatic certificate renewal were all covered in this guide. Certbot's documentation is a fantastic place to start if you have any additional questions about how to use it.



  • 91 Users Found This Useful
Was this answer helpful?

Related Articles

How to set up automated backups for VPS.

The adventure does not end with the creation of a website. You'll need to keep your website up to...

Re-installations in a flash

Our user-friendly cloud interface allows you to rebuild your Virtual Private Server. When you...

Mode of Recovery

You can use the recovery mode to back up your data within the server at any moment if you lose...

Root Access

You can have complete control over your VPS if you have root access. Root access enables you to...

Cached Ssd

In comparison to standard Hard Disk Drives, SSD Cached storage technology caches your Virtual...