HTTPS opsetzen mat Let's Encrypt SSL Certificate For Nginx op RHEL/CentOS 7/6


No der virdru Let's Encrypt Serie betreffend Apache oder Nginx Webserver mat SSL/TLS Modul, wäerte mir Iech guidéieren wéi Dir en SSL/TLS Zertifika generéiert an installéiere kënnt, deen gratis vun Let's Encrypt Certificate Authority kritt gëtt, déi mir benotzen fir Nginx Webserver HTTP Transaktiounen op CentOS/RHEL 7/6 a Fedora Verdeelung ze sécheren.

Wann Dir sicht Let's Encrypt fir Apache op RHEL/CentOS 7/6 a Fedora Verdeelungen z'installéieren, befollegt dëse Guide hei ënnen:

  1. En registréierten Domain Numm mat valabelen A DNS records fir zréck op de Server ëffentlech IP Adress ze weisen.
  2. Nginx Webserver installéiert mat SSL aktivéiert a virtuelle Hosten aktivéiert (nëmme fir Multiple Domains oder Subdomains Hosting).

Schrëtt 1: Installéieren Nginx Web Server

1. Am éischte Schrëtt, am Fall wou Dir den Nginx Daemon net schonn installéiert hutt, gitt déi folgend Kommandoen mat Root Privilegien fir den Nginx Webserver vun Epel Repositories z'installéieren:

# yum install epel-release
# yum install nginx

Schrëtt 2: Luet oder Klon Gratis Loosst eis SSL Zertifikat verschlësselen

2. Déi schnellsten Method fir de Let's Encrypt Client op Linux Systemer z'installéieren andeems d'Packagen aus Github Repositories klonen.

Als éischt installéiere de Git Client um System mam Kommando ënnen:

# yum install git

3. Nodeems de Git Client installéiert ass, ännert de Verzeechnes op /opt Wee an zitt Let's Encrypt Software andeems Dir déi folgend Kommandoen ausféiert:

# cd /opt
# git clone https://github.com/letsencrypt/letsencrypt

Schrëtt 3: Generéiere e Gratis Let's Encrypt SSL Certificate fir Nginx

4. De Prozess fir e gratis SSL/TLS Zertifika fir Nginx ze kréien gëtt manuell gemaach andeems Dir Let's Encrypt Standalone Plugin benotzt.

Dës Method erfuerdert datt den Hafen 80 gratis muss sinn während der Zäit Let's Encrypt Client validéiert d'Identitéit vum Server a generéiert Certificaten.

Also, wann Nginx scho leeft, stoppen den Daemon mam folgendem Kommando a lafen ss Utility fir ze bestätegen datt den Hafen 80 net méi am Netzstack benotzt gëtt.

# service nginx stop
# systemctl stop nginx
# ss -tln

5. Elo ass et Zäit fir e gratis SSL Zertifika vu Let's Encrypt ze kréien. Gitt op Let's Encrypt Installatiounsverzeichnis, wann Dir net schonn do sidd, a lafen de Kommando letsencrypt-auto mat der certonly --standalone Optioun an -d Fändel fir all Domain oder Subdomain, deen Dir wëllt en Zertifika generéiere wéi am Beispill hei ënnen proposéiert.

# cd /opt
# ./letsencrypt-auto certonly --standalone -d your_domain.tld -d www.yourdomain.tld

6. No enger Serie vu Packagen an Ofhängegkeeten déi op Ärer Maschinn installéiert sinn, Loosst eis verschlësselen Iech op Äre Kont aginn, deen fir verluerene Schlësselerhuelung oder dréngend Notifikatiounen benotzt gëtt.

7. Als nächst sollt Dir d'Lizenzbedéngungen averstanen andeems Dir op Enter Schlëssel dréckt.

8. Schlussendlech, wann alles wéi et sollt gaangen ass, gëtt e Gratulatiounsinformatiounsmessage op Ärem Bash-Terminal gewisen. De Message gëtt och ugewisen wann de Certificat oflafen.

Schrëtt 4: Installéiere Let's Encrypt SSL Certificate in Nginx

9. Elo datt Dir e gratis SSL/TLS Zertifika hutt, ass et Zäit et am Nginx Webserver z'installéieren fir datt Ären Domain et benotzt.

All nei SSL Certificaten ginn an /etc/letsencrypt/live/ ënner engem Verzeechnes no Ärem Domain Numm gesat. Benotzt ls Kommando fir d'Zertifikatdateien opzemaachen, déi fir Ären Domain erausginn sinn an se z'identifizéieren.

# sudo ls /etc/letsencrypt/live/
# sudo ls -al /etc/letsencrypt/live/your_domain.tld

10. Fir d'Zertifikatdateien an Nginx z'installéieren an SSL z'aktivéieren, öffnen d'/etc/nginx/nginx.conf Datei fir z'änneren a fügen déi ënnen Aussoen no der leschter Lauschtertlinn vum Serverblock un. Benotzt d'Illustratioun hei ënnen als Guide.

# vi /etc/nginx/nginx.conf

Nginx SSL Block Extrait:

# SSL configuration
listen 443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/your_domain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.tld/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

Ersetzt den Domain Numm String fir SSL Certificaten fir Ären eegene Domain ze passen.

11. Endlech, restart den Nginx Service a besicht Är Domain iwwer HTTPS Protokoll op https://yourdomain. D'Säit soll glat lueden, ouni Zertifikatfehler.

# systemctl restart nginx
# service nginx restart

12. Fir den SSL/TLS Zertifika a seng Richtegkeet z'iwwerpréiwen, besicht de folgende Link:

https://www.ssllabs.com/ssltest/analyze.html 

13. Am Fall wou Dir eng Notifikatioun kritt datt Äre Server e schwaache DH Schlësselaustausch an eng Gesamtbewäertung vu B Grad ënnerstëtzt, generéiert en neien Diffie-Hellman Chiffer am /etc/nginx/ssl/ Verzeichnis fir Äre Server géint de Logjam Attack ze schützen lafen déi folgend Kommandoen.

# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out dhparams.pem 4096

An dësem Beispill hu mir e 4096 Bit Schlëssel benotzt, deen tatsächlech laang dauert fir ze generéieren an en extra Overhead op Ärem Server an op SSL Handshake ze setzen.

Am Fall wou et kee explizit Bedierfnes ass fir e Schlëssel sou laang ze benotzen an Dir sidd net paranoid, sollt Dir sécher sinn mat engem 2048 Bit Schlëssel.

14. Nodeems den DH Schlëssel generéiert gouf, öffnen d'Nginx Konfiguratiounsdatei a füügt déi ënnen Aussoen no der ssl_ciphers Linn fir den DH Schlëssel ze addéieren an de Sécherheetsniveau vun Ärem Domain op en A+ eropzesetzen. Grad.

# vi /etc/nginx/nginx.conf

Füügt folgend Blockauszug op Nginx.conf:

ssl_dhparam /etc/nginx/ssl/dhparams.pem;
ssl_session_timeout 30m;
ssl_session_cache shared:SSL:10m;
ssl_buffer_size 8k;
add_header Strict-Transport-Security max-age=31536000;

15. Restart Nginx Service fir Ännerungen z'applizéieren an Äert SSL Zertifika ze testen andeems Dir de fréiere Resultatcache vum Link hei uewen erwähnt.

# systemctl restart nginx
# service nginx restart

Schrëtt 5: Auto Renew Nginx Free Lets Encrypt SSL Certificates

16. Let's Encrypt CA verëffentlecht fräi SSL/TLS Certificaten valabel fir 90 Deeg. Zertifikater kënnen manuell erneiert an applizéiert ginn virum Verfall mam Webroot Plugin, ouni Äre Webserver ze stoppen, andeems Dir déi folgend Kommandoen ausgëtt:

# ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/usr/share/nginx/html/ -d yourdomain.tld -d www.yourdomain.tld
# systemctl reload nginx

Wann Dir de uewe genannte Kommando leeft, gitt sécher datt Dir den webroot-Path ersetzt fir mat Ärem Webserverdokumentroot ze passen, spezifizéiert duerch Nginx Root Ausso.

17. Fir den Zertifikat automatesch ze erneieren ier et ofleeft, erstellt dëse Bash Skript vum github erikaheidi am /usr/local/bin/ Verzeechnes a füügt den Inhalt hei ënnen (de Skript ass liicht geännert fir den Nginx Astellung ze reflektéieren).

# vi /usr/local/bin/cert-renew

Füügt folgend Zeilen un cert-renew Datei.

#!/bin/bash

webpath='/usr/share/nginx/html/'
domain=$1
le_path='/opt/letsencrypt'
le_conf='/etc/letsencrypt'
exp_limit=30;

get_domain_list(){
        certdomain=$1
        config_file="$le_conf/renewal/$certdomain.conf"

        if [ ! -f $config_file ] ; then
                echo "[ERROR] The config file for the certificate $certdomain was not found."
                exit 1;
        fi

        domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}")
        last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}')

        if [ "${last_char}" = "," ]; then
                domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}')
        fi

        echo $domains;
}

if [ -z "$domain" ] ; then
        echo "[ERROR] you must provide the domain name for the certificate renewal."
        exit 1;
fi

cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"

if [ ! -f $cert_file ]; then
        echo "[ERROR] certificate file not found for domain $domain."
        exit 1;
fi

exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
datenow=$(date -d "now" +%s)
days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)

echo "Checking expiration date for $domain..."

if [ "$days_exp" -gt "$exp_limit" ] ; then
        echo "The certificate is up to date, no need for renewal ($days_exp days left)."
        exit 0;
else
        echo "The certificate for $domain is about to expire soon. Starting renewal request..."
        domain_list=$( get_domain_list $domain )
"$le_path"/letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=”$webpath” --domains "${domain_list}"
        echo "Reloading Nginx..."
sudo systemctl reload nginx
        echo "Renewal process finished for domain $domain"
        exit 0;
fi

18. Ersetzen $webpath Variabel vum Ufank vum Skript fir mat Ärem Nginx Dokument root ze passen. Vergewëssert Iech datt de Skript ausführbar ass an de bc Rechner op Ärem System installéiert ass andeems Dir déi folgend Kommandoen ausginn.

# chmod +x /usr/local/bin/cert-renew
# yum install bc

Dir kënnt de Skript géint Är Domain testen andeems Dir de folgende Kommando ausgitt:

# /usr/local/bin/cert-renew yourdomain.tld


19. Schlussendlech, fir den Zertifikat Erneierungsprozess automatesch auszeféieren, füügt eng nei Cron-Job un fir de Skript all Woch auszeféieren fir den Zertifika bannent 30 Deeg virum Verfallsdatum ze aktualiséieren.

# crontab -e

Füügt déi folgend Zeil um Enn vun der Datei.

@weekly  /usr/local/bin/cert-renew your_domain.tld >> /var/log/your_domain.tld-renew.log 2>&1

Dat ass alles! Elo kann den Nginx Server séchere Webinhalt mat engem gratis SSL/TLS Let's Encrypt Zertifikat op Ärer Websäit liwweren.