در دنباله ی سری پست های let's encrypt مربوط به Apache یا Nginx با استفاده ازماژول SSL/TLS، در این پست به نحوه ایجاد و نصب یک گواهینامه SSL/TLS رایگان از مرکز Let’s Encrypt Certificate Authority خواهیم پرداخت که به منظور امن کردن تعاملات http در وب سرور nginx و روی توزیع های CentOS/RHEL 7/6 و Fedora مورد استفاده قرار می گیرد.
همچنین توصیه میشود مطالعه کنید.
نصب و راه اندازی Let's Encrypt SSL روی وب سرور آپاچی در CentOS 8
نصب و راه اندازی Let's Encrypt SSL Certificate روی Apache در RHEL − CentOS 7/6 و Fedora 7/6 (به زودی)
آموزش نصب LEMP به همراه MariaDB و PHP-FPM در اوبونتو 16
آموزش نصب LEMP به همراه MariaDB و PHP-FPM در دبیان 9
آموزش نصب LEMP به همراه MariaDB و PHP-FPM در RedHat/CentOS 7.0 و Fedora 24
تجهیزات مورد نیاز :
• دامنه (domain name) ثبت شده بهمراه A DNS record های valid برای ارتباط با ip public سرور
• وب سرور نصب شده ی Nginx که ssl و Virtual Hosts آن فعال باشد. (تنها برای هاست چند دامینی- multiple domains یا subdomains hosting)
محیط تستی ما به این صورت است :
مرحله 1 : نصب وب سرور Nginx
1 - در وهله اول اگرسرویس nginx را روی سرور نصب ندارید از دستورات زیر با دسترسی root اقدام به نصب وب سرور nginx از طریق ریپازیتوری Epel نمایید.
مرحله 2 - دانلود یا کلون Let’s Encrypt Certificate :
2 - سریعترین روش برای نصب کلاینت Let’s Encrypt روی سیستم های لینوکسی از طریق کپی کردن پکیج ها از ریپازیتوری github می باشد.
ابتدا کلاینت git را با استفاده از دستور زیر روی سیستم نصب میکنیم :
3- بعد از نصب کلاینت git، وارد دایرکتوری /opt شده و گواهینامه نرم افزار Let’s Encrypt را با استفاده از دستور زیر clone میکنیم .
مرحله 3 - ایجاد یک Let’s Encrypt SSL Certificate رایگان برای nginx
4 - فرایند بدست آوردن یک SSL/TLS Certificate رایگان برای nginx گواهینامه رایگان Let’s Encrypt را به واسطه استفاده از پلاگین Let’s Encrypt Standalone انجام میشود .
در این روش نیاز است که در طول مدت زمانی که کلاینت Let’s Encrypt در حال اعتبار سنجی هویت سرور است و certificate ها را ایجاد میکند ، پورت 80 آزاد باشد .
بنابراین اگر nginx از قبل در حال اجرا بود، سرویس آن را با استفاده از دستور زیر stop کنید و دستور ss را برای اطمینان از اینکه پورت 80 در شبکه در حال استفاده نباشد اجرا میکنیم :
5 - اکنون زمان گرفتن یک SSL Certificate رایگان از Let’s Encrypt است. به دایرکتوری نصب Let’s Encrypt وارد شوید و دستور letsencrypt-auto را با آپشن --standalone و گزینه ی -d برای هر domain یا subdomain که میخواهید برای آن یک Certificate ایجاد کنید ، همانند دستور زیر استفاده کنید :
6 - بعد از نصب پکیج ها و پیش نیاز ها (dependency ها) روی ماشین، Let’s Encrypt از شما میخواهد تا آدرس ایمیل مان را وارد کنیم. این ایمیل زمانی استفاده میشود که ما کلید رمزنگاری را گم کردیم و نیاز به ریکاوری کلید داریم .
7 - سپس به مرحله تأیید license terms می رسیم و enter را میزنیم:
8 - در نهایت اگر همه چیز به درستی پیش رفته باشد پیغامی برای ما نمایش داده میشود با این مظمون که با موفقیت certificate ما نصب شده هست. همچنین این پیغام اطلاعات دیگری مانند زمان منقضی شدن certificate را نیز نمایش می دهد.
مرحله 4 - نصب Let’s Encrypt SSL Certificate در nginx
9 - اکنون که شما صاحب یک SSL/TLS Certificate رایگان شدید زمان آن است که این Certificate را در وب سرور nginx خود نصب کنید تا domain تان از آن استفاده کند.
همه ی SSL Certificate های جدید در مسیر /etc/letsencrypt/live/ و در دایرکتوری ای هم نام domain تان قرار می گیرند.برای نمایش لیست فایلهای certificate مربوط به domain تان و تشخیص آنها از دستور ls استفاده می کنیم :
10 - برای نصب فایلهای certificate در nginx و فعال کردن SSL ابتدا فایل /etc/nginx/nginx.conf را برای ویرایش باز کنید وعبارات زیر را بعد از آخرین خط listen از server block اضافه کنید. به مثال زیر توجه کنید:
Nginx SSL block excerpt :
string مربوط به domain name را برای اینکه SSL certificates با domain خودتان مچ شود، جایگزین کنید.
11- در نهایت وب سرور nginx را restart کنید. بعد از ریستارت می توانید با استفاده پورت 443 یا پروتکل https سایت خود را مشاهده کنید : https://yourdomain .که اگر تمامی موارد را بدرستی انجام داده باشید، بدون خطای certificate می توانید صفحه مد نظر خود را مشاهده کنید.
12- برای تست SSL/TLS certificate خود میتوانید به لینک زیر وارد شوید. و پروتکل ssl/tls خود را مورد تست و آزمایش قرار دهید.
13- در مواردی که شما متوجه شدید که سرور تان از رمز نگاری ضعیف Diffie-Hellman و rating کلی درجه B پشتیبانی میکند باید یک رمز جدید Diffie-Hellman در دایرکتوری /etc/nginx/ssl/ ایجاد کنید که بمنظور محافظت از سرورتان در مقابل حملات Logjam استفاده میشود و برای آن دستورات زیر را اجرا میکینیم :
در این مثال ما از یک رمز 4096 بیتی استفاده کردیم که در حقیقت مدت زمان زیادی طول می کشد تا ایجاد شود و یک overhead اضافی روی روی سرورتان و روی SSL handshake می اندازد.
دراینجا نیازی به استفاده از یک کلید انقدر طولانی نیست و شما با یک کلید 2048 بیتی امنیت خواهید داشت.
14 - بعد از اینکه کلید DH ساخته شد فایل کانفیگ nginx را باز کنید و عبارات زیر را بعد از خط ssl_ciphers اضافه کنید تا علاوه بر اضافه کردن کلید DH، سطوح امنیتی دامین تان به رتبه ی A+ افزایش یابد.
خطوط زیر را به nginx.conf اضافه کنید :
15 - وب سرور nginx را ریستارت میکنیم تا تنظیمات اعمال شود و SSL certificate تان را با پاک کردن کش نتیجه قبلی از لینک ذکر شده در بالا را دوباره تست میکنیم :
مرحله 5 - جدید کردن اتوماتیک Lets Encrypt SSL Certificates رایگان در nginx
16 - Let’s Encrypt CA در حقیقت SSL/TLS certificates های رایگان و معتبر به مدت 90 روز را منتشر میکند. certificate ها را میتوان به صورت دستی دوباره جدید کرد و قبل از انقضاء با استفاده از پلاگین web root و بدون توقف در وب سرورتان با استفاده از دستور زیر آنرا اعمال کنید.
زمانیکه دستور بالا را اجرا میکنید مطمئن شوید که webroot-path را برای match شدن document root سرور web تان جایگزین کنید که توسط عبارت nginx root مشخص میشود.
17 - به منظور جدید کردن اتوماتیک certificate قبل از اینکه expire شود این bash script را از github erikaheidi بسازید و در دایرکتوری /usr/local/bin قرار دهید و محتوای زیر را در آن کپی کنید. (اسکریپت در حد بالایی به منظور تاثیر روی nginx تغییر یافته است)
در فایل cert-renew محتوای زیر را اضافه کنید :
18 - متغییر $webpath از ابتدای اسکریپت را به منظور match شدن با document root در nginx تان جایگزین کنید. مطمئن شوید که اسکریپت قابل اجراست و bc calculator روی سیستم تان نصب است که میتوانید از دستورات زیر استفاده کنید.
شما میتوانید این اسکریپت را در برابر دامین خود و با استفاده از دستور زیر تست کنید.
19 - در نهایت برای اجرا کردن پروسه رفرش certificate به صورت اتوماتیک میتوانید یک cronjob جدید اضافه کنید که هر هفته به منظور update کردن certificate در طول 30 روز قبل از تاریخ انقضای آن اجرا شود.
خطوط زیر را پایان فایل اضافه کنید.
اکنون سرور nginx میتواند محتوای وب را به صورت کاملا امن و با یک SSL/TLS Let’s Encrypt certificate رایگان روی وب سایت تان نمایش دهد.
موفق باشید.
معصومه وحید
همچنین توصیه میشود مطالعه کنید.
نصب و راه اندازی Let's Encrypt SSL روی وب سرور آپاچی در CentOS 8
نصب و راه اندازی Let's Encrypt SSL Certificate روی Apache در RHEL − CentOS 7/6 و Fedora 7/6 (به زودی)
آموزش نصب LEMP به همراه MariaDB و PHP-FPM در اوبونتو 16
آموزش نصب LEMP به همراه MariaDB و PHP-FPM در دبیان 9
آموزش نصب LEMP به همراه MariaDB و PHP-FPM در RedHat/CentOS 7.0 و Fedora 24
تجهیزات مورد نیاز :
• دامنه (domain name) ثبت شده بهمراه A DNS record های valid برای ارتباط با ip public سرور
• وب سرور نصب شده ی Nginx که ssl و Virtual Hosts آن فعال باشد. (تنها برای هاست چند دامینی- multiple domains یا subdomains hosting)
محیط تستی ما به این صورت است :
مرحله 1 : نصب وب سرور Nginx
1 - در وهله اول اگرسرویس nginx را روی سرور نصب ندارید از دستورات زیر با دسترسی root اقدام به نصب وب سرور nginx از طریق ریپازیتوری Epel نمایید.
کد PHP:
# yum install epel-release
# yum install nginx
مرحله 2 - دانلود یا کلون Let’s Encrypt Certificate :
2 - سریعترین روش برای نصب کلاینت Let’s Encrypt روی سیستم های لینوکسی از طریق کپی کردن پکیج ها از ریپازیتوری github می باشد.
ابتدا کلاینت git را با استفاده از دستور زیر روی سیستم نصب میکنیم :
کد PHP:
# yum install git
کد PHP:
# cd /opt
# git clone https://github.com/letsencrypt/letsencrypt
مرحله 3 - ایجاد یک Let’s Encrypt SSL Certificate رایگان برای nginx
4 - فرایند بدست آوردن یک SSL/TLS Certificate رایگان برای nginx گواهینامه رایگان Let’s Encrypt را به واسطه استفاده از پلاگین Let’s Encrypt Standalone انجام میشود .
در این روش نیاز است که در طول مدت زمانی که کلاینت Let’s Encrypt در حال اعتبار سنجی هویت سرور است و certificate ها را ایجاد میکند ، پورت 80 آزاد باشد .
بنابراین اگر nginx از قبل در حال اجرا بود، سرویس آن را با استفاده از دستور زیر stop کنید و دستور ss را برای اطمینان از اینکه پورت 80 در شبکه در حال استفاده نباشد اجرا میکنیم :
کد PHP:
# service nginx stop
# systemctl stop nginx
# ss -tln
5 - اکنون زمان گرفتن یک SSL Certificate رایگان از Let’s Encrypt است. به دایرکتوری نصب Let’s Encrypt وارد شوید و دستور letsencrypt-auto را با آپشن --standalone و گزینه ی -d برای هر domain یا subdomain که میخواهید برای آن یک Certificate ایجاد کنید ، همانند دستور زیر استفاده کنید :
کد PHP:
# cd /opt
# ./letsencrypt-auto certonly --standalone -d your_domain.tld -d www.yourdomain.tld
6 - بعد از نصب پکیج ها و پیش نیاز ها (dependency ها) روی ماشین، Let’s Encrypt از شما میخواهد تا آدرس ایمیل مان را وارد کنیم. این ایمیل زمانی استفاده میشود که ما کلید رمزنگاری را گم کردیم و نیاز به ریکاوری کلید داریم .
7 - سپس به مرحله تأیید license terms می رسیم و enter را میزنیم:
8 - در نهایت اگر همه چیز به درستی پیش رفته باشد پیغامی برای ما نمایش داده میشود با این مظمون که با موفقیت certificate ما نصب شده هست. همچنین این پیغام اطلاعات دیگری مانند زمان منقضی شدن certificate را نیز نمایش می دهد.
مرحله 4 - نصب Let’s Encrypt SSL Certificate در nginx
9 - اکنون که شما صاحب یک SSL/TLS Certificate رایگان شدید زمان آن است که این Certificate را در وب سرور nginx خود نصب کنید تا domain تان از آن استفاده کند.
همه ی SSL Certificate های جدید در مسیر /etc/letsencrypt/live/ و در دایرکتوری ای هم نام domain تان قرار می گیرند.برای نمایش لیست فایلهای certificate مربوط به domain تان و تشخیص آنها از دستور ls استفاده می کنیم :
کد PHP:
# sudo ls /etc/letsencrypt/live/
# sudo ls -al /etc/letsencrypt/live/your_domain.tld
10 - برای نصب فایلهای certificate در nginx و فعال کردن SSL ابتدا فایل /etc/nginx/nginx.conf را برای ویرایش باز کنید وعبارات زیر را بعد از آخرین خط listen از server block اضافه کنید. به مثال زیر توجه کنید:
کد PHP:
# vi /etc/nginx/nginx.conf
کد PHP:
# 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';
string مربوط به domain name را برای اینکه SSL certificates با domain خودتان مچ شود، جایگزین کنید.
11- در نهایت وب سرور nginx را restart کنید. بعد از ریستارت می توانید با استفاده پورت 443 یا پروتکل https سایت خود را مشاهده کنید : https://yourdomain .که اگر تمامی موارد را بدرستی انجام داده باشید، بدون خطای certificate می توانید صفحه مد نظر خود را مشاهده کنید.
کد PHP:
# systemctl restart nginx
# service nginx restart
کد PHP:
https://www.ssllabs.com/ssltest/analyze.html
13- در مواردی که شما متوجه شدید که سرور تان از رمز نگاری ضعیف Diffie-Hellman و rating کلی درجه B پشتیبانی میکند باید یک رمز جدید Diffie-Hellman در دایرکتوری /etc/nginx/ssl/ ایجاد کنید که بمنظور محافظت از سرورتان در مقابل حملات Logjam استفاده میشود و برای آن دستورات زیر را اجرا میکینیم :
کد PHP:
# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out dhparams.pem 4096
دراینجا نیازی به استفاده از یک کلید انقدر طولانی نیست و شما با یک کلید 2048 بیتی امنیت خواهید داشت.
14 - بعد از اینکه کلید DH ساخته شد فایل کانفیگ nginx را باز کنید و عبارات زیر را بعد از خط ssl_ciphers اضافه کنید تا علاوه بر اضافه کردن کلید DH، سطوح امنیتی دامین تان به رتبه ی A+ افزایش یابد.
کد PHP:
# vi /etc/nginx/nginx.conf
کد PHP:
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 certificate تان را با پاک کردن کش نتیجه قبلی از لینک ذکر شده در بالا را دوباره تست میکنیم :
کد PHP:
# systemctl restart nginx
# service nginx restart
مرحله 5 - جدید کردن اتوماتیک Lets Encrypt SSL Certificates رایگان در nginx
16 - Let’s Encrypt CA در حقیقت SSL/TLS certificates های رایگان و معتبر به مدت 90 روز را منتشر میکند. certificate ها را میتوان به صورت دستی دوباره جدید کرد و قبل از انقضاء با استفاده از پلاگین web root و بدون توقف در وب سرورتان با استفاده از دستور زیر آنرا اعمال کنید.
کد PHP:
# ./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
زمانیکه دستور بالا را اجرا میکنید مطمئن شوید که webroot-path را برای match شدن document root سرور web تان جایگزین کنید که توسط عبارت nginx root مشخص میشود.
17 - به منظور جدید کردن اتوماتیک certificate قبل از اینکه expire شود این bash script را از github erikaheidi بسازید و در دایرکتوری /usr/local/bin قرار دهید و محتوای زیر را در آن کپی کنید. (اسکریپت در حد بالایی به منظور تاثیر روی nginx تغییر یافته است)
کد PHP:
# vi /usr/local/bin/cert-renew
کد PHP:
#!/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
کد PHP:
# chmod +x /usr/local/bin/cert-renew
# yum install bc
کد PHP:
# /usr/local/bin/cert-renew yourdomain.tld
19 - در نهایت برای اجرا کردن پروسه رفرش certificate به صورت اتوماتیک میتوانید یک cronjob جدید اضافه کنید که هر هفته به منظور update کردن certificate در طول 30 روز قبل از تاریخ انقضای آن اجرا شود.
کد PHP:
# crontab -e
کد PHP:
@weekly /usr/local/bin/cert-renew your_domain.tld >> /var/log/your_domain.tld-renew.log 2>&1
موفق باشید.
معصومه وحید