How to Enable TLS 1.3 in Nginx on Ubuntu 18.04 LTS

TLS 1.3 is a version of the Transport Layer Security (TLS) protocol that was published in 2018 as a proposed standard in RFC 8446. It offers security and performance improvements over its predecessors.

This guide will demonstrate how to enable TLS 1.3 using the Nginx web server on Ubuntu 18.04 LTS.

Requirements

  • Nginx version 1.13.0 or greater.
  • OpenSSL version 1.1.1 or greater.
  • Vultr Cloud Compute (VC2) instance running Ubuntu 18.04.
  • A valid domain name and properly configured A/AAAA/CNAME DNS records for your domain.
  • A valid TLS certificate. We will get one from Let's Encrypt.

Before you begin

Check the Ubuntu version.

lsb_release -ds
# Ubuntu 18.04.1 LTS

Create a new non-root user account with sudo access and switch to it.

adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe
su - johndoe

NOTE: Replace johndoe with your username.

Set up the timezone.

sudo dpkg-reconfigure tzdata

Ensure that your system is up to date.

sudo apt update && sudo apt upgrade -y

Install build-essential, socat and git packages.

sudo apt install -y build-essential socat git

Install Acme.sh client and obtain TLS certificate from Let's Encrypt

Download and install Acme.sh.

sudo mkdir /etc/letsencrypt
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh 
sudo ./acme.sh --install --home /etc/letsencrypt --accountemail [email protected]
cd ~
source ~/.bashrc

Check the version.

acme.sh --version
# v2.8.0

Obtain RSA and ECDSA certificates for your domain.

# RSA 2048
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --ocsp-must-staple --keylength 2048
# ECDSA
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --ocsp-must-staple --keylength ec-256

NOTE: Replace example.com in commands with your domain name.

After running the previous commands, your certificates and keys will be accessible at:

  • For RSA: /etc/letsencrypt/example.com directory.
  • For ECC/ECDSA: /etc/letsencrypt/example.com_ecc directory.

Build Nginx from Source

Nginx added support for TLS 1.3 in version 1.13.0. On most Linux distributions, including Ubuntu 18.04, Nginx is built with the older OpenSSL version, which does not support TLS 1.3. Consequently, we need our own custom Nginx build linked to the OpenSSL 1.1.1 release, which includes support for TLS 1.3.

Download the latest mainline version of the Nginx source code and extract it.

wget https://nginx.org/download/nginx-1.15.5.tar.gz && tar zxvf nginx-1.15.5.tar.gz

Download the OpenSSL 1.1.1 source code and extract it.

# OpenSSL version 1.1.1
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz && tar xzvf openssl-1.1.1.tar.gz

Delete all .tar.gz files, as they will not be needed anymore.

rm -rf *.tar.gz

Enter the Nginx source directory.

cd ~/nginx-1.15.5

Configure, compile and install Nginx. For the simplicity's sake, we will compile only essential modules that are required for TLS 1.3 to work. If you need a full Nginx build, you can read this Vultr guide about Nginx compilation.

./configure --prefix=/etc/nginx \
            --sbin-path=/usr/sbin/nginx \
            --modules-path=/usr/lib/nginx/modules \
            --conf-path=/etc/nginx/nginx.conf \
            --error-log-path=/var/log/nginx/error.log \
            --pid-path=/var/run/nginx.pid \
            --lock-path=/var/run/nginx.lock \
            --user=nginx \
            --group=nginx \
            --build=Ubuntu \
            --builddir=nginx-1.15.5 \
            --http-log-path=/var/log/nginx/access.log \
            --http-client-body-temp-path=/var/cache/nginx/client_temp \
            --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
            --with-compat \
            --with-http_ssl_module \
            --with-http_v2_module \
            --with-openssl=../openssl-1.1.1 \
            --with-openssl-opt=no-nextprotoneg \
            --without-http_rewrite_module \
            --without-http_gzip_module

make
sudo make install

Create Nginx system group and user.

sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx

Symlink /usr/lib/nginx/modules to /etc/nginx/modules directory. etc/nginx/modules is a standard place for Nginx modules.

sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

Create Nginx cache directories and set proper permissions.

sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*

Check the Nginx version.

sudo nginx -V

# nginx version: nginx/1.15.5 (Ubuntu)
# built by gcc 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
# built with OpenSSL 1.1.1  11 Sep 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx . . .
# . . .

Create Nginx systemd unit file.

sudo vim /etc/systemd/system/nginx.service

Populate the file with the following configuration.

[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

Start and enable Nginx.

sudo systemctl start nginx.service
sudo systemctl enable nginx.service

Create conf.d, sites-available and sites-enabled directories in /etc/nginx directory.

sudo mkdir /etc/nginx/{conf.d,sites-available,sites-enabled}

Run sudo vim /etc/nginx/nginx.conf and add the following two directives to the end of file, just before the closing }.

    . . .
    . . .
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
}

Save the file and exit with :+W+Q.

Configure Nginx for TLS 1.3

Now that we have successfully built Nginx, we are ready to configure it to start using TLS 1.3 on our server.

Run sudo vim /etc/nginx/conf.d/example.com.conf and populate the file with the following configuration.

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  # RSA
  ssl_certificate /etc/letsencrypt/example.com/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/example.com/example.com.key;
  # ECDSA
  ssl_certificate /etc/letsencrypt/example.com_ecc/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/example.com_ecc/example.com.key;

  ssl_protocols TLSv1.2 TLSv1.3;

  ssl_prefer_server_ciphers on;

  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
}

Save the file and exit with :+W+Q.

Notice the new TLSv1.3 parameter of the ssl_protocols directive. This parameter is necessary to enable TLS 1.3.

Check the configuration.

sudo nginx -t

Reload Nginx.

sudo systemctl reload nginx.service

To verify TLS 1.3, you can use browser dev tools or SSL Labs service. The screenshots below shows Chrome's security tab that shows that TLS 1.3 is working.

How to Enable TLS 1.3 in Nginx on Ubuntu 18.04 LTS

How to Enable TLS 1.3 in Nginx on Ubuntu 18.04 LTS

Congratulations! You have successfully enabled TLS 1.3 on your Ubuntu 18.04 web server.


Settu upp Plesk á CentOS 7

Settu upp Plesk á CentOS 7

Að nota annað kerfi? Plesk er sérstakt stjórnborð fyrir vefþjón sem gerir notendum kleift að stjórna persónulegum og/eða viðskiptavinum vefsíðum sínum, gagnagrunnum

Hvernig á að setja upp eftirlitslausar uppfærslur á Debian 9 (Stretch)

Hvernig á að setja upp eftirlitslausar uppfærslur á Debian 9 (Stretch)

Að nota annað kerfi? Ef þú kaupir Debian netþjón, þá ættirðu alltaf að vera með nýjustu öryggisplástrana og uppfærslurnar, hvort sem þú ert sofandi eða ekki

How to Install Apache Cassandra 3.11.x on Ubuntu 16.04 LTS

How to Install Apache Cassandra 3.11.x on Ubuntu 16.04 LTS

Using a Different System? Apache Cassandra is a free and open source NoSQL database management system that is designed to provide scalability, hig

How to Install Kanboard on Ubuntu 18.04 LTS

How to Install Kanboard on Ubuntu 18.04 LTS

Using a Different System? Introduction Kanboard is a free and open source project management software program which is designed to facilitate and visualiz

How to Install Kanboard on Debian 9

How to Install Kanboard on Debian 9

Using a Different System? Introduction Kanboard is a free and open source project management software program which is designed to facilitate and visualiz

Settu upp Lynis á Debian 8

Settu upp Lynis á Debian 8

Inngangur Lynis er ókeypis, opinn uppspretta kerfisendurskoðunarverkfæri sem er notað af mörgum kerfisstjórum til að sannreyna heilleika og herða kerfi þeirra. ég

Að búa til net Minecraft netþjóna með BungeeCord á Debian 8, Debian 9 eða CentOS 7

Að búa til net Minecraft netþjóna með BungeeCord á Debian 8, Debian 9 eða CentOS 7

Það sem þú þarft Vultr VPS með að minnsta kosti 1GB af vinnsluminni. SSH aðgangur (með rót / stjórnunarréttindi). Skref 1: Uppsetning BungeeCord Fyrst af öllu

Patching the Dirty Cow Exploit on CentOS

Patching the Dirty Cow Exploit on CentOS

What is Dirty Cow (CVE-2016-5195) ? The Dirty Cow vulnerability is exploited through how Linux processes code. It allows for an unprivileged user to gai

Endurstilla MySQL rót lykilorð á Debian/Ubuntu

Endurstilla MySQL rót lykilorð á Debian/Ubuntu

Ef þú hefur gleymt MySQL rót lykilorðinu þínu geturðu endurstillt það með því að fylgja skrefunum í þessari grein. Ferlið er frekar einfalt og vinnur á þessum

How to Install and Configure ArangoDB on CentOS 7

How to Install and Configure ArangoDB on CentOS 7

Using a Different System? Introduction ArangoDB is an open source NoSQL database with a flexible data model for documents, graphs, and key-values. It is

Notkun Etckeeper fyrir útgáfustýringu á /etc

Notkun Etckeeper fyrir útgáfustýringu á /etc

Inngangur /etc/ skrárinn gegnir mikilvægu hlutverki í því hvernig Linux kerfi virkar. Ástæðan fyrir þessu er sú að næstum allar kerfisstillingar

Settu upp Wordpress með Apache, PHP og MySQL (sjálfvirkt ræsingarforrit)

Settu upp Wordpress með Apache, PHP og MySQL (sjálfvirkt ræsingarforrit)

Þú getur afritað og límt eftirfarandi bash forskrift inn í ræsingarforskriftasvæði Vultr stjórnborðsins. Það mun setja upp alla nauðsynlega pakka til að ru

CentOS 8 Setja upp aðgang með SSH

CentOS 8 Setja upp aðgang með SSH

Inngangur Þessi handbók útskýrir hvernig á að búa til SSH lykla, bæta almenningslyklinum við CentOS 8 netþjóninn þinn og stilla sshd fyrir lykilorðslausa innskráningu. Skref 1

Hvernig á að setja upp osTicket á FreeBSD 12

Hvernig á að setja upp osTicket á FreeBSD 12

Að nota annað kerfi? osTicket er opinn uppspretta miðasölukerfi fyrir þjónustuver. osTicket frumkóði er hýst opinberlega á Github. Í þessari kennslu

Clusting RabbitMQ á CentOS 7

Clusting RabbitMQ á CentOS 7

RabbitMQ er opinn skilaboðamiðlari sem styður AMQP, STOMP og aðra samskiptatækni. Það er mikið notað í fyrirtækjaforritum og

Afritaðu sjálfkrafa marga MySQL eða MariaDB gagnagrunna

Afritaðu sjálfkrafa marga MySQL eða MariaDB gagnagrunna

Inngangur Í þessari skrifum skaltu fara vel í gegnum hvernig á að taka öryggisafrit af mörgum MySQL eða MariaDB gagnagrunnum sem sitja á sömu vél með því að nota sérsniðið bash scrip

Hvernig á að setja upp Vagrant á CentOS 6

Hvernig á að setja upp Vagrant á CentOS 6

Fyrir hvaða nútíma þróunarteymi sem er er alltaf góð hugmynd að nota sameinað kóða keyrsluumhverfi í gegnum verkefnið. Í sameinuðum kóða runnin

Hvernig á að setja upp Jenkins á CentOS 7

Hvernig á að setja upp Jenkins á CentOS 7

Jenkins er vinsælt opinn uppspretta CI (Continuous Integration) tól sem er mikið notað fyrir þróun verkefna, dreifingu og sjálfvirkni. Þessi grein vill

Settu upp Apache Maven á Ubuntu 18.04

Settu upp Apache Maven á Ubuntu 18.04

Inngangur Apache Maven er ókeypis og opinn uppspretta verkefnastjórnunartæki notað fyrir Java verkefni. Þú getur auðveldlega stjórnað verkefnabyggingu, skýrslugerð, og

Settu upp Elgg á CentOS 7

Settu upp Elgg á CentOS 7

Að nota annað kerfi? Elgg er opinn uppspretta samfélagsnetavél sem gerir kleift að búa til félagslegt umhverfi eins og háskólanet og

The Rise of Machines: Real World Applications of AI

The Rise of Machines: Real World Applications of AI

Gervigreind er ekki í framtíðinni, hún er hér í nútímanum Í þessu bloggi Lestu hvernig gervigreindarforrit hafa haft áhrif á ýmsa geira.

DDOS árásir: Stutt yfirlit

DDOS árásir: Stutt yfirlit

Ertu líka fórnarlamb DDOS árása og ruglaður með forvarnaraðferðirnar? Lestu þessa grein til að leysa spurningar þínar.

Hefur þú einhvern tíma velt því fyrir þér hvernig tölvuþrjótar græða peninga?

Hefur þú einhvern tíma velt því fyrir þér hvernig tölvuþrjótar græða peninga?

Þú gætir hafa heyrt að tölvuþrjótar græða mikið af peningum, en hefur þú einhvern tíma velt því fyrir þér hvernig þeir vinna sér inn svona peninga? við skulum ræða.

Byltingarkenndar uppfinningar frá Google sem munu auðvelda lífi þínu.

Byltingarkenndar uppfinningar frá Google sem munu auðvelda lífi þínu.

Viltu sjá byltingarkenndar uppfinningar frá Google og hvernig þessar uppfinningar breyttu lífi hvers manns í dag? Lestu síðan til að blogga til að sjá uppfinningar frá Google.

Föstudagur Nauðsynlegur: Hvað varð um gervigreindardrifna bíla?

Föstudagur Nauðsynlegur: Hvað varð um gervigreindardrifna bíla?

Hugmyndin um að sjálfkeyrandi bílar fari á göturnar með hjálp gervigreindar er draumur sem við höfum átt um tíma núna. En þrátt fyrir nokkur loforð eru þau hvergi sjáanleg. Lestu þetta blogg til að læra meira…

Tæknileg sérkenni: Fjarlæg framtíð mannlegrar siðmenningar?

Tæknileg sérkenni: Fjarlæg framtíð mannlegrar siðmenningar?

Þar sem vísindin þróast hratt og taka yfir mikið af viðleitni okkar, eykst hættan á því að verða fyrir óútskýranlegri einstæðu. Lestu, hvað sérkenni gæti þýtt fyrir okkur.

Þróun gagnageymslu – Infographic

Þróun gagnageymslu – Infographic

Geymsluaðferðir gagna hafa verið að þróast gæti verið frá fæðingu gagna. Þetta blogg fjallar um þróun gagnageymslu á grundvelli upplýsingamynda.

Virkni Big Data Reference Architecture Layers

Virkni Big Data Reference Architecture Layers

Lestu bloggið til að þekkja mismunandi lög í Big Data Architecture og virkni þeirra á einfaldasta hátt.

6 ótrúlegir kostir þess að hafa snjall heimilistæki í lífi okkar

6 ótrúlegir kostir þess að hafa snjall heimilistæki í lífi okkar

Í þessum stafræna heimi hafa snjallheimilistæki orðið afgerandi hluti af lífi. Hér eru nokkrir ótrúlegir kostir snjallheimatækja um hvernig þau gera líf okkar þess virði að lifa því og einfaldara.

macOS Catalina 10.15.4 viðbót uppfærsla veldur fleiri vandamálum en að leysa

macOS Catalina 10.15.4 viðbót uppfærsla veldur fleiri vandamálum en að leysa

Nýlega gaf Apple út macOS Catalina 10.15.4 viðbótaruppfærslu til að laga vandamál en svo virðist sem uppfærslan sé að valda fleiri vandamálum sem leiða til múrsteins á Mac vélum. Lestu þessa grein til að læra meira