tls upgrade
Prerequisites
- Ubuntu server with sudo, network
- Tools: Nginx, OpenSSL
- IP: 192.168.64.9
- Firewall: Allow port 443
Setup TLS 1.0
Update packages
sudo apt update && sudo apt upgrade -y
Install, enable, and start Nginx
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
Configure firewall
sudo ufw allow 'Nginx Full'
sudo ufw status
Create SSL directory
sudo mkdir -p /etc/nginx/ssl
Generate cert and key
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/nginx-selfsigned.key \
-out /etc/nginx/ssl/nginx-selfsigned.crt \
-subj "/C=US/ST=California/L=SanFrancisco/O=MyCompany/OU=IT/CN=192.168.64.9"
Generate Diffie-Hellman parameters
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
Config /etc/nginx/sites-available/default
sudo rm -f /etc/nginx/sites-enabled/default
sudo vim /etc/nginx/sites-available/default
Content
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / { try_files $uri $uri/ =404; }
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name 192.168.64.9;
ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location / { try_files $uri $uri/ =404; }
}
Link
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Test
sudo nginx -t
Modify OpenSSL (/etc/ssl/openssl.cnf)
- Add at top
openssl_conf = default_conf
- At bottom
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT:@SECLEVEL=1
Restart
sudo systemctl restart nginx
Verify
openssl s_client -connect 192.168.64.9:443 -tls1
Backup
Create a timestamped backup directory
TIMESTAMP=$(date +%Y%m%d%H%M%S)
BACKUP_DIR="/home/ubuntu/config_backups/tls1_setup_$TIMESTAMP"
mkdir -p "$BACKUP_DIR/nginx" "$BACKUP_DIR/ssl_configs" "$BACKUP_DIR/nginx_certs"
- Backup
sudo cp /etc/nginx/sites-available/default "$BACKUP_DIR/nginx/"
sudo cp /etc/ssl/openssl.cnf "$BACKUP_DIR/ssl_configs/"
sudo cp -a /etc/nginx/ssl/* "$BACKUP_DIR/nginx_certs/"
Disable TLS 1.0 and Enable TLS 1.2
OpenSSL (/etc/ssl/openssl.cnf)
MinProtocol = TLSv1.2
Nginx config
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
Test
sudo nginx -t
Restart
sudo systemctl restart nginx
Verify
openssl s_client -connect 192.168.64.9:443 -tls1 # Fails
openssl s_client -connect 192.168.64.9:443 -tls1_2 # Works
Rollback TLS
Set directory
export BACKUP_DIR_PATH="/home/ubuntu/config_backups/tls1_setup_20250415223857"
Stop Nginx service
sudo systemctl stop nginx
Restore configurations from backup
- Restore
sudo cp "$BACKUP_DIR_PATH/nginx/default" /etc/nginx/sites-available/default
sudo cp "$BACKUP_DIR_PATH/ssl_configs/openssl.cnf" /etc/ssl/openssl.cnf
Test
sudo nginx -t
Restart
sudo systemctl restart nginx
Verify
openssl s_client -connect 192.168.64.9:443 -tls1 # Works
openssl s_client -connect 192.168.64.9:443 -tls1_2 # Works