Nastavitev HTTPS s šifriranjem SSL certifikata za Nginx na RHEL/CentOS 7/6


Po prejšnji seriji Let's Encrypt v zvezi s spletnim strežnikom Apache ali Nginx z modulom SSL/TLS vas bomo v tem članku vodili, kako ustvariti in namestiti potrdilo SSL/TLS, ki smo ga brezplačno pridobili pri pooblaščenem certifikatu Let's Encrypt, ki ga bomo uporabljali za zaščito transakcij HTTP spletnega strežnika Nginx na CentOS/RHEL 7/6 in Fedora distribuciji.

Če želite namestiti Let’s Encrypt for Apache v distribucije RHEL/CentOS 7/6 in Fedora, sledite spodnjim navodilom:

  1. Registrirano ime domene z veljavnimi zapisi DNS, ki kažejo nazaj na javni naslov IP strežnika.
  2. Spletni strežnik Nginx, nameščen z omogočenim SSL in navideznimi gostitelji (samo za gostovanje več domen ali poddomen).

1. korak: Namestite spletni strežnik Nginx

1. Če v prvem koraku še niste namestili demona Nginx, izdajte spodnje ukaze s korenskimi privilegiji, da namestite spletni strežnik Nginx iz repolovih Epel:

# yum install epel-release
# yum install nginx

2. korak: Prenesite ali klonirajte brezplačno Šifrirajmo SSL potrdilo

2. Najhitrejša metoda namestitve odjemalca Let’s Encrypt v sisteme Linux s kloniranjem paketov iz github-ovih skladišč.

Najprej v sistem namestite git client z naslednjim ukazom:

# yum install git

3. Po namestitvi odjemalca git spremenite imenik v pot /opt in povlecite programsko opremo Let's Encrypt, tako da zaženemo spodnje ukaze:

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

3. korak: Ustvarite brezplačno šifrirano potrdilo SSL za Nginx

4. Postopek pridobivanja brezplačnega potrdila SSL/TLS za Nginx bo potekal ročno z uporabo vtičnika Let’s Encrypt Standalone.

Ta metoda zahteva, da morajo biti vrata 80 brezplačna v času, ko odjemalec Let's Encrypt potrdi identiteto strežnika in ustvari potrdila.

Torej, če se Nginx že izvaja, zaustavite demon z naslednjim ukazom in zaženite pripomoček ss , da potrdite, da vrata 80 niso več v uporabi v omrežju.

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

5. Zdaj je čas, da pridobite brezplačno potrdilo SSL od Let’s Encrypt. Premaknite se v namestitveni imenik Let's Encrypt, če še niste tam, in zaženite ukaz letsencrypt-auto z možnostjo certonly --standalone in -d zastavica za vsako domeno ali poddomeno, za katero želite ustvariti potrdilo, kot je predlagano v spodnjem primeru.

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

6. Po namestitvi vrste paketov in odvisnosti na vaš računalnik vas bo Let’s Encrypt pozval, da vnesete svoj račun, ki bo uporabljen za obnovitev izgubljenega ključa ali nujna obvestila.

7. Nato se morate strinjati z licenčnimi pogoji s pritiskom tipke Enter.

8. Nazadnje, če je šlo vse tako, kot je treba, bo na vašem bash terminalu prikazano informativno sporočilo o čestitki. Sporočilo bo prikazano tudi, ko bo certifikat potekel.

4. korak: Namestite šifrirajmo SSL potrdilo v Nginx

9. Zdaj, ko ste lastnik brezplačnega potrdila SSL/TLS, je čas, da ga namestite v spletni strežnik Nginx, da ga bo lahko uporabila vaša domena.

Vsa nova potrdila SSL se shranijo v /etc/letsencrypt/live/ v imenik, imenovan po imenu vaše domene. Z ukazom ls poiščite datoteke potrdil, izdane za vašo domeno, in jih identificirajte.

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

10. Če želite namestiti datoteke potrdil v Nginx in omogočiti SSL, odprite datoteko /etc/nginx/nginx.conf za urejanje in dodajte spodnje izjave po zadnji vrstici poslušanja iz bloka strežnika. Kot vodilo uporabite spodnjo sliko.

# vi /etc/nginx/nginx.conf

Izvleček bloka Nginx SSL:

# 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';

Zamenjajte niz domenskega imena za potrdila SSL, da se ujema z vašo domeno.

11. Na koncu znova zaženite storitev Nginx in obiščite svojo domeno prek protokola HTTPS na https:/yourdomain . Stran se mora nalagati gladko, brez napak v potrdilu.

# systemctl restart nginx
# service nginx restart

12. Za potrditev SSL/TLS certifikata in njegove naravnosti obiščite naslednjo povezavo:

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

13. Če prejmete obvestilo, da vaš strežnik podpira šibko izmenjavo ključev DH in splošno oceno B, ustvarite novo šifro Diffie-Hellman v imeniku/etc/nginx/ssl /, da zaščitite strežnik pred napadom Logjam s strani zagon naslednjih ukazov.

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

V tem primeru smo uporabili 4096-bitni ključ, ki dejansko traja dolgo časa za ustvarjanje in doda dodatne režijske stroške na strežnik in SSL stisk.

Če tako dolgo ni treba izrecno uporabljati ključa in če niste paranoični, bi morali biti na varnem z 2048-bitnim ključem.

14. Ko je DH ključ ustvarjen, odprite konfiguracijsko datoteko Nginx in dodajte spodnje izjave za vrstico ssl_ciphers , da dodate ključ DH in dvignete raven varnosti svoje domene na A + ocena.

# vi /etc/nginx/nginx.conf

V Nginx.conf dodajte naslednji odlomek bloka:

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. Znova zaženite storitev Nginx, da uporabite spremembe in znova preizkusite svoje potrdilo SSL, tako da počistite prejšnji predpomnilnik rezultatov iz zgoraj omenjene povezave.

# systemctl restart nginx
# service nginx restart

5. korak: Samodejno obnovite Nginx Free Lets Encrypt SSL Certificates

16. Let's Encrypt CA izda brezplačna potrdila SSL/TLS, veljavna 90 dni. Potrdila lahko ročno obnovite in uporabite pred potekom z uporabo vtičnika webroot, ne da bi ustavili spletni strežnik, tako da izdate spodnje ukaze:

# ./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

Pri zagonu zgornjega ukaza obvezno zamenjajte webroot-path , da se ujema s korenom dokumenta vašega spletnega strežnika, določenim s korenskim stavkom Nginx.

17. Če želite samodejno obnoviti potrdilo, preden poteče, ustvarite ta bash skript iz github erikaheidi v imeniku/usr/local/bin/in dodajte spodnjo vsebino (skript je nekoliko spremenjen, da odraža nastavitve Nginxa).

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

V datoteko cert-renew dodajte naslednje vrstice.

#!/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. Zamenjajte spremenljivko $webpath na začetku skripta, da se ujema s korenom dokumenta Nginx. Prepričajte se, da je skript izvedljiv in da je v sistem nameščen kalkulator bc , tako da izdate naslednje ukaze.

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

Skript lahko preizkusite v svoji domeni tako, da izdate naslednji ukaz:

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


19. Nazadnje, če želite samodejno zagnati postopek podaljšanja certifikata, dodajte novo opravilo cron, da boste skript izvajali vsak teden, da boste potrdilo posodobili v 30 dneh pred datumom poteka veljavnosti.

# crontab -e

Na dnu datoteke dodajte naslednjo vrstico.

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

To je vse! Zdaj lahko strežnik Nginx zagotavlja varno spletno vsebino z brezplačnim potrdilom SSL/TLS Let's Encrypt na vašem spletnem mestu.