Skip to main content

SSL Configuration

Configure HTTPS for your Nginx websites using Let's Encrypt certificates.


Prerequisites​

1. Domain Name​

  • Must point to your server's IP address
  • DNS propagation completed

2. Nginx Server Block​

  • Server block already configured
  • ServerName matches your domain

1. Install Certbot​

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

2. Obtain SSL Certificate​

sudo certbot --nginx -d example.com -d www.example.com

3. Auto-Renewal Setup​

sudo crontab -e
# Add this line:
0 12 * * * /usr/bin/certbot renew --quiet

Manual SSL Configuration​

1. Generate Private Key​

sudo openssl genrsa -out /etc/ssl/private/example.com.key 2048

2. Generate Certificate Signing Request​

sudo openssl req -new -key /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.csr

3. Generate Self-Signed Certificate (for testing)​

sudo openssl x509 -req -days 365 -in /etc/ssl/certs/example.com.csr -signkey /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.crt

4. Configure Server Block for SSL​

sudo nano /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl;
server_name example.com www.example.com;

ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;

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

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

error_log /var/log/nginx/example.com_error.log;
access_log /var/log/nginx/example.com_access.log;
}

5. Enable Site and Test​

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL Renewal​

Let's Encrypt Auto-Renewal​

# Test renewal
sudo certbot renew --dry-run

# Manual renewal
sudo certbot renew

Manual Certificate Renewal​

# Generate new certificate
sudo openssl x509 -req -days 365 -in /etc/ssl/certs/example.com.csr -signkey /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.crt

# Reload Nginx
sudo systemctl reload nginx

Force HTTPS Redirect​

sudo nano /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}

Quick Commands​

TaskCommand
Check SSL statussudo certbot certificates
Test renewalsudo certbot renew --dry-run
Manual renewalsudo certbot renew
Delete certificatesudo certbot delete --cert-name example.com
Check Nginx SSLsudo nginx -t

Note: Let's Encrypt certificates expire after 90 days. Auto-renewal is essential.