Skip to main content

SSL/TLS Setup and HTTPS Configuration

In this lesson, we'll secure your Nginx web server by implementing SSL/TLS encryption and configuring HTTPS. You'll learn how to protect data in transit and provide a secure browsing experience for your users.

By the end of this lesson, you will be able to:

  • Generate SSL certificates using Let's Encrypt
  • Configure Nginx to serve content over HTTPS
  • Set up automatic certificate renewal
  • Implement HTTP to HTTPS redirection
  • Understand different SSL/TLS configuration options

Understanding SSL/TLS Basics​

SSL (Secure Sockets Layer) and its successor TLS (Transport Layer Security) are cryptographic protocols that provide secure communication over a computer network. When implemented on your web server, they:

  • Encrypt data between the client and server
  • Verify server identity
  • Ensure data integrity
tip

Modern browsers now display "Not Secure" warnings for HTTP sites, making SSL/TLS essential for all production websites.

Generating SSL Certificates with Let's Encrypt​

Let's Encrypt provides free SSL certificates through an automated process. We'll use Certbot, the official ACME client.

First, install Certbot:

Install Certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx

Generate certificates for your domain:

Generate SSL Certificate
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot will automatically modify your Nginx configuration to use the generated certificates.

Configuring HTTPS in Nginx​

Let's examine a basic HTTPS server block configuration:

/etc/nginx/sites-available/yourdomain.com
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;

ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

# SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

root /var/www/yourdomain.com/html;
index index.html index.htm;

location / {
try_files $uri $uri/ =404;
}
}

Redirecting HTTP to HTTPS​

It's crucial to redirect all HTTP traffic to HTTPS. Add this server block:

HTTP to HTTPS Redirect
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;

return 301 https://$server_name$request_uri;
}
warning

Always test your redirects! A misconfigured redirect can create infinite loops or break your site.

Advanced SSL/TLS Configuration​

Strong SSL Configuration​

For better security, use this enhanced SSL configuration:

Enhanced SSL Settings
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# Modern configuration for TLS 1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;

# Enable HSTS
add_header Strict-Transport-Security "max-age=63072000" always;

OCSP Stapling​

Enable OCSP stapling for better performance and privacy:

OCSP Stapling Configuration
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

Certificate Auto-Renewal​

Let's Encrypt certificates expire every 90 days. Set up automatic renewal:

Test Auto-Renewal
sudo certbot renew --dry-run

Add a cron job for automatic renewal:

Add to crontab
sudo crontab -e
# Add this line:
0 12 * * * /usr/bin/certbot renew --quiet
Single Domain SSL
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# ... rest of configuration
}

Testing Your SSL Configuration​

After configuring SSL, test your setup:

Test Nginx Configuration
sudo nginx -t
sudo systemctl reload nginx

Use online tools or OpenSSL to verify your SSL setup:

Test SSL with OpenSSL
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com

Common Pitfalls​

  • Mixed Content Issues: Ensure all resources (CSS, JS, images) are loaded via HTTPS
  • Certificate Chain Problems: Always include intermediate certificates in your configuration
  • HSTS Preload: Don't enable HSTS preload until you're certain you'll always use HTTPS
  • Wildcard Certificates: Remember they only cover one level of subdomains (*.example.com doesn't cover sub.sub.example.com)
  • SNI Support: Ensure your Nginx version supports Server Name Indication for hosting multiple SSL sites on one IP

Summary​

You've successfully learned how to:

  • Generate free SSL certificates using Let's Encrypt and Certbot
  • Configure Nginx to serve content over HTTPS with proper security settings
  • Implement HTTP to HTTPS redirection
  • Set up automatic certificate renewal
  • Apply advanced SSL/TLS features like OCSP stapling and HSTS

SSL/TLS configuration is essential for modern web security and user trust. Regular maintenance and staying updated with security best practices will keep your sites secure.

Quiz​

Nginx SSL/TLS and HTTPS Configuration

What is the primary purpose of implementing SSL/TLS on a web server?

Question 1/5