ການຕັ້ງຄ່າ HTTPS ດ້ວຍ Let’s encryption SSL Certificate ສຳ ລັບ Nginx ເທິງ RHEL/CentOS 7/6


ປະຕິບັດຕາມຊຸດ Let's Encrypt ທີ່ຜ່ານມາກ່ຽວກັບເຄື່ອງແມ່ຂ່າຍເວັບໄຊຕ໌ Apache ຫຼື Nginx ທີ່ມີໂມດູນ SSL/TLS, ບົດຂຽນນີ້ພວກເຮົາຈະແນະ ນຳ ທ່ານກ່ຽວກັບວິທີການສ້າງແລະຕິດຕັ້ງໃບຢັ້ງຢືນ SSL/TLS ທີ່ໄດ້ຮັບໂດຍບໍ່ເສຍຄ່າຈາກ Let’s Encrypt Certificate Authority ທີ່ພວກເຮົາຈະໃຊ້ ເພື່ອຮັບປະກັນການໂອນເງິນຂອງ Nginx webserver HTTP ໃນ CentOS/RHEL 7/6 ແລະການແຈກຈ່າຍ Fedora.

ຖ້າທ່ານ ກຳ ລັງຊອກຫາການຕິດຕັ້ງ Let’s Encrypt for Apache ໃນການແຈກຢາຍ RHEL/CentOS 7/6 ແລະ Fedora, ໃຫ້ເຮັດຕາມ ຄຳ ແນະ ນຳ ຂ້າງລຸ່ມນີ້:

<

  • ຊື່ໂດເມນທີ່ລົງທະບຽນພ້ອມດ້ວຍບັນທຶກ DNS ທີ່ຖືກຕ້ອງເພື່ອຊີ້ໄປທີ່ IP address ສາທາລະນະຂອງ server.
  • ເຄື່ອງແມ່ຂ່າຍເວັບໄຊຕ໌ Nginx ຕິດຕັ້ງດ້ວຍ SSL ທີ່ເປີດໃຊ້ງານແລະ Virtual Hosts ເປີດໃຊ້ງານ (ສຳ ລັບຫລາຍໂດເມນຫລື subdomain hosting).
  • ຂັ້ນຕອນທີ 1: ຕິດຕັ້ງ Nginx Web Server

    1. ໃນບາດກ້າວ ທຳ ອິດ, ໃນກໍລະນີທີ່ທ່ານບໍ່ມີ Nginx daemon ຕິດຕັ້ງແລ້ວ, ອອກ ຄຳ ສັ່ງຂ້າງລຸ່ມນີ້ໂດຍມີສິດທິພິເສດເພື່ອຕິດຕັ້ງ Nginx webserver ຈາກ Epel repositories:

    # yum install epel-release
    # yum install nginx
    

    ຂັ້ນຕອນທີ 2: ດາວໂຫລດຫລື Clone Free Let’s encryption SSL ໃບຢັ້ງຢືນ

    ວິທີທີ່ໄວທີ່ສຸດໃນການຕິດຕັ້ງລູກຄ້າ Let’s Encrypt ໃນລະບົບ Linux ໂດຍການກົດປຸ່ມຫຸ້ມຫໍ່ຈາກຫໍສະມຸດ github.

    ກ່ອນອື່ນ ໝົດ, ຕິດຕັ້ງລູກຄ້າ git ໃນລະບົບດ້ວຍ ຄຳ ສັ່ງຂ້າງລຸ່ມນີ້:

    # yum install git
    

    3. ຫຼັງຈາກທີ່ລູກຄ້າ git ໄດ້ຖືກຕິດຕັ້ງແລ້ວ, ໃຫ້ປ່ຽນລະບົບເສັ້ນທາງໄປສູ່ເສັ້ນທາງ /ເລືອກ ແລະດຶງຊອຟແວຂອງ Encrypt ໂດຍການແລ່ນ ຄຳ ສັ່ງຕໍ່ໄປນີ້:

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

    ຂັ້ນຕອນທີ 3: ສ້າງໃບຢັ້ງຢືນການ SSL ຂອງ Let’s Encrypt SSL ສຳ ລັບ Nginx

    4. ຂັ້ນຕອນໃນການໄດ້ຮັບໃບຢັ້ງຢືນ SSL/TLS ທີ່ບໍ່ເສຍຄ່າ ສຳ ລັບ Nginx ຈະຖືກເຮັດດ້ວຍຕົນເອງໂດຍການ ນຳ ໃຊ້ໂປແກຼມ Let's Encrypt Standalone.

    ວິທີການນີ້ຮຽກຮ້ອງໃຫ້ພອດ 80 ຕ້ອງບໍ່ເສຍຄ່າໃນເວລາທີ່ໃຫ້ລູກຄ້າເຂົ້າລະຫັດເພື່ອກວດສອບຕົວຕົນຂອງເຄື່ອງແມ່ຂ່າຍແລະສ້າງໃບຢັ້ງຢືນ.

    ສະນັ້ນ, ຖ້າ Nginx ກຳ ລັງແລ່ນຢູ່ແລ້ວ, ໃຫ້ຢຸດ daemon ດ້ວຍ ຄຳ ສັ່ງຕໍ່ໄປນີ້ແລະ ດຳ ເນີນການ ss utility ເພື່ອຢັ້ງຢືນວ່າ port 80 ບໍ່ໄດ້ ນຳ ໃຊ້ຢູ່ໃນເຄືອຂ່າຍອີກຕໍ່ໄປ.

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

    5. ດຽວນີ້ເຖິງເວລາແລ້ວທີ່ຈະໄດ້ຮັບໃບຢັ້ງຢືນ SSL ຈາກ Let’s Encrypt. ຍ້າຍໄປທີ່ລະບົບຕິດຕັ້ງລະບົບການຕິດຕັ້ງ Let's Encrypt, ຖ້າທ່ານບໍ່ມີຢູ່ແລ້ວ, ແລະ ດຳ ເນີນການ ຄຳ ສັ່ງ letsencrypt-auto ພ້ອມດ້ວຍຕົວເລືອກ --standalone ທີ່ມີໃບຢັ້ງຢືນແລະ -d ທຸງ ສຳ ລັບແຕ່ລະໂດເມນຫລືໂດເມນຍ່ອຍທີ່ທ່ານຕ້ອງການສ້າງໃບຢັ້ງຢືນຕາມທີ່ແນະ ນຳ ໃນຕົວຢ່າງຂ້າງລຸ່ມນີ້.

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

    6. ຫຼັງຈາກຊຸດຂອງຊຸດແລະຄວາມເພິ່ງພາອາໃສຖືກຕິດຕັ້ງຢູ່ໃນເຄື່ອງຂອງທ່ານ, Let’s Encrypt ຈະກະຕຸ້ນໃຫ້ທ່ານເຂົ້າບັນຊີຂອງທ່ານເຊິ່ງຈະຖືກໃຊ້ ສຳ ລັບການກູ້ຄືນຂໍ້ມູນ ສຳ ຄັນຫຼືການແຈ້ງເຕືອນທີ່ຮີບດ່ວນ.

    7. ຕໍ່ໄປທ່ານຄວນຍອມຮັບເງື່ອນໄຂການອະນຸຍາດໂດຍກົດປຸ່ມ Enter.

    8. ສຸດທ້າຍ, ຖ້າທຸກຢ່າງ ດຳ ເນີນໄປຕາມທີ່ຄວນ, ຂໍ້ຄວາມທີ່ສະແດງຄວາມຍິນດີຈະຖືກສະແດງຢູ່ໃນກະແສໄຟຟ້າຂອງທ່ານ. ຂໍ້ຄວາມຍັງຈະສະແດງເວລາທີ່ໃບຢັ້ງຢືນຈະ ໝົດ ອາຍຸ.

    ຂັ້ນຕອນທີ 4: ຕິດຕັ້ງ Let’s Encrypt SSL ໃບຢັ້ງຢືນໃນ Nginx

    9. ດຽວນີ້ທ່ານເປັນເຈົ້າຂອງໃບຢັ້ງຢືນ SSL/TLS ທີ່ບໍ່ເສຍຄ່າ, ມັນເຖິງເວລາແລ້ວທີ່ຈະຕິດຕັ້ງມັນໃນ Nginx webserver ເພື່ອໃຫ້ໂດເມນຂອງທ່ານໃຊ້ມັນ.

    ໃບຢັ້ງຢືນ SSL ໃໝ່ ທັງ ໝົດ ແມ່ນຖືກຈັດໃສ່ໃນ /etc/letsencrypt/live/ ພາຍໃຕ້ໄດເລກະທໍລີທີ່ມີຊື່ຫຼັງຊື່ໂດເມນຂອງທ່ານ. ໃຊ້ ຄຳ ສັ່ງ ls ເພື່ອລາຍຊື່ເອກະສານໃບຢັ້ງຢືນທີ່ອອກ ສຳ ລັບໂດເມນຂອງທ່ານແລະ ກຳ ນົດພວກມັນ.

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

    10. ເພື່ອຕິດຕັ້ງເອກະສານໃບຢັ້ງຢືນໃນ Nginx ແລະເປີດໃຊ້ SSL, ເປີດ /etc/nginx/nginx.conf ເພື່ອແກ້ໄຂແລະເພີ່ມ ຄຳ ຖະແຫຼງການຂ້າງລຸ່ມນີ້ຫຼັງຈາກຟັງເພງສຸດທ້າຍຈາກ block server. ໃຊ້ຕົວຢ່າງຂ້າງລຸ່ມນີ້ເປັນ ຄຳ ແນະ ນຳ.

    # vi /etc/nginx/nginx.conf
    

    ບົດຄັດຫຍໍ້ຂອງ 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';
    

    ປ່ຽນສາຍເຊືອກຊື່ໂດເມນ ສຳ ລັບໃບຢັ້ງຢືນ SSL ໃຫ້ກົງກັບໂດເມນຂອງທ່ານເອງ.

    11. ສຸດທ້າຍ, ເລີ່ມການບໍລິການ Nginx ຄືນ ໃໝ່ ແລະເຂົ້າເບິ່ງໂດເມນຂອງທ່ານຜ່ານ HTTPS Protocol ທີ່ https:/yourdomain . ໜ້າ ເວັບຄວນໂຫລດໄດ້ລຽບ, ບໍ່ມີຂໍ້ຜິດພາດໃນໃບຢັ້ງຢືນ.

    # systemctl restart nginx
    # service nginx restart
    

    12. ໃນຄໍາສັ່ງເພື່ອກວດສອບໃບຢັ້ງຢືນການ SSL/TLS ແລະຄວາມກົງໄປກົງມາຂອງການເຊື່ອມຕໍ່ດັ່ງຕໍ່ໄປນີ້:

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

    13. ໃນກໍລະນີທີ່ທ່ານໄດ້ຮັບການແຈ້ງເຕືອນວ່າເຊີບເວີຂອງທ່ານສະ ໜັບ ສະ ໜູນ ການແລກປ່ຽນລະຫັດ DH ທີ່ອ່ອນແອແລະການໃຫ້ຄະແນນໂດຍລວມຂອງຊັ້ນ B, ສ້າງ Diffie-Hellman cipher ໃໝ່ ໃນ/etc/nginx/ssl/directory ເພື່ອປົກປ້ອງ server ຂອງທ່ານຕໍ່ກັບການໂຈມຕີ Logjam ໂດຍ ແລ່ນ ຄຳ ສັ່ງຕໍ່ໄປນີ້.

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

    ໃນຕົວຢ່າງນີ້, ພວກເຮົາໄດ້ໃຊ້ປຸ່ມ 4096 ນ້ອຍ, ເຊິ່ງໃຊ້ເວລາດົນນານໃນການຜະລິດແລະວາງຄ່າພິເສດໄວ້ໃນເຊີຟເວີຂອງທ່ານແລະໃນການຈັບມື SSL.

    ໃນກໍລະນີທີ່ບໍ່ມີຄວາມຕ້ອງການທີ່ຈະໃຊ້ປຸ່ມຍາວນີ້ແລະທ່ານບໍ່ຄວນລະງັບ, ທ່ານຄວນຈະປອດໄພດ້ວຍຄີ 2048.

    14. ຫລັງຈາກທີ່ DH key ໄດ້ຖືກສ້າງຂື້ນມາ, ເປີດແຟ້ມການຕັ້ງຄ່າ Nginx ແລະເພີ່ມ ຄຳ ຖະແຫຼງຂ້າງລຸ່ມນີ້ຫຼັງຈາກທີ່ ssl_ciphers ສາຍເພື່ອເພີ່ມຄີ DH ແລະເພີ່ມລະດັບຄວາມປອດໄພຂອງໂດເມນຂອງທ່ານໃສ່ A + ເກຣດ.

    # vi /etc/nginx/nginx.conf
    

    ເພີ່ມ ຄຳ ອ້າງອີງຕໍ່ໄປນີ້ໃສ່ 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. ເລີ່ມການບໍລິການ Nginx ເພື່ອ ນຳ ໃຊ້ການປ່ຽນແປງແລະກວດໃບຢັ້ງຢືນ SSL ຂອງທ່ານໂດຍການລຶບລ້າງຖານຂໍ້ມູນຜົນໄດ້ຮັບທີ່ຜ່ານມາຈາກລິ້ງທີ່ກ່າວມາຂ້າງເທິງ.

    # systemctl restart nginx
    # service nginx restart
    

    ຂັ້ນຕອນທີ 5: ການຕໍ່ອາຍຸແບບອັດຕະໂນມັດ Nginx ຟຣີສາມາດເຂົ້າລະຫັດໃບຢັ້ງຢືນ SSL

    16. Let’s Encrypt CA ປ່ອຍໃບຢັ້ງຢືນ SSL/TLS ຟຣີທີ່ມີອາຍຸການໃຊ້ງານໄດ້ 90 ວັນ. ໃບຢັ້ງຢືນສາມາດໄດ້ຮັບການຕໍ່ແລະ ນຳ ໃຊ້ດ້ວຍຕົນເອງກ່ອນ ໝົດ ອາຍຸໂດຍໃຊ້ໂປແກຼມ webroot, ໂດຍບໍ່ຕ້ອງຢຸດເຄື່ອງແມ່ຂ່າຍເວັບຂອງທ່ານ, ໂດຍການອອກ ຄຳ ສັ່ງຂ້າງລຸ່ມນີ້:

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

    ເມື່ອໃຊ້ ຄຳ ສັ່ງຂ້າງເທິງນີ້ໃຫ້ແນ່ໃຈວ່າທ່ານທົດແທນ <ລະຫັດເສັ້ນທາງເວັບໄຊຕ໌ ເພື່ອກົງກັບຮາກເອກະສານເຊີເວີ້ຂອງເວັບໄຊຕ໌ຂອງທ່ານ, ລະບຸໂດຍໃບລາຍງານຮາກຂອງ Nginx.

    17. ເພື່ອທີ່ຈະຕໍ່ໃບຢັ້ງຢືນໂດຍອັດຕະໂນມັດກ່ອນທີ່ມັນຈະ ໝົດ ອາຍຸສ້າງ script bash ນີ້ຈາກ github erikaheidi ໃນ/usr/local/bin/ໄດເລກະທໍລີແລະເພີ່ມເນື້ອຫາລຸ່ມນີ້ (ສະຄິບທີ່ມັນຖືກດັດແປງເລັກນ້ອຍເພື່ອສະທ້ອນເຖິງການຕັ້ງຄ່າ Nginx).

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

    ຕື່ມສາຍຕໍ່ໄປນີ້ໃສ່ແຟ້ມ cert-renew .

    #!/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. ປ່ຽນຕົວປ່ຽນ $webpath ຕັ້ງແຕ່ເລີ່ມຕົ້ນຂອງ script ເພື່ອໃຫ້ກົງກັບຮາກເອກະສານ Nginx ຂອງທ່ານ. ໃຫ້ແນ່ໃຈວ່າສະຄິບທີ່ສາມາດປະຕິບັດໄດ້ແລະເຄື່ອງຄິດໄລ່ bc ຖືກຕິດຕັ້ງຢູ່ໃນລະບົບຂອງທ່ານໂດຍການອອກ ຄຳ ສັ່ງຕໍ່ໄປນີ້

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

    ທ່ານສາມາດທົດສອບສະຄິບຕໍ່ໂດເມນຂອງທ່ານໂດຍການອອກ ຄຳ ສັ່ງຕໍ່ໄປນີ້:

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


    19. ສຸດທ້າຍ, ເພື່ອ ດຳ ເນີນຂັ້ນຕອນການຕໍ່ອາຍຸໃບຢັ້ງຢືນໂດຍອັດຕະໂນມັດ, ເພີ່ມວຽກ cron ໃໝ່ ເພື່ອປະຕິບັດສະຄຣິບທຸກໆອາທິດເພື່ອໃຫ້ການປັບປຸງໃບຢັ້ງຢືນພາຍໃນ 30 ວັນກ່ອນວັນ ໝົດ ອາຍຸ.

    # crontab -e
    

    ຕື່ມແຖວຕໍ່ໄປນີ້ຢູ່ທາງລຸ່ມຂອງເອກະສານ.

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

    ຫມົດເທົ່ານີ້! ຕອນນີ້ເຄື່ອງແມ່ຂ່າຍ Nginx ສາມາດສົ່ງເນື້ອຫາທີ່ປອດໄພດ້ວຍໃບຢັ້ງຢືນ SSL/TLS Let’s Encrypt ໃນເວັບໄຊທ໌ຂອງທ່ານໂດຍບໍ່ເສຍຄ່າ.