نصب و فعال Https روی Apache در لینوکس

در پست می خوایم نحوه ای نصب کردن گواهی نامه SSL یا همون https روی سرور های لینوکس بر روی وب سرور apache رو آموزش بدم و در پست بعدی نحوه ای نصب روی وب سرور nginx اموزش خواهم داد.اینکه https چیه و چه مزایای نسبت به http داره می تونید از این لینک در موردش بخونید و در یک جمله اینو بگم که فرق بین http و https اینکه در پروتکل ارتباطی https ارتباط بین کاربر و سرور به صورت امن خواهد بود و از نظر سئو هم تاثیر داره بر روی سایت.فرق بین https با httpیکی از راه های نصب و فعال کردن https خرید گواهینامه SSL یا همون TLS از سایت معتبر هست که بعد از خرید سه تا فایل می دن که اون ها روی سرور آپلود می کنید یا اگه از CDN استفاده می کنید روی سرویس CDN که از آن استفاده می کنید , آپلود می کنید ولی ما در این پست نحوه ای نصب و استفاده از https های رایگان که در سطح اینترنت هستند رو آموزش می دیم. در واقع TLS همون نسخه ای ارتقا یافته ای SSL هست ورژن SSL 3.1 همان TLS 1.0 است. در حال حاضر TLS به ورژن 1.2 ٰرسیده و در هریک از این آپدیت‌ها امکانات امنیتی جدیدی افزوده و معرفی می شود.این نکته رو هم بگم که گواهینامه های پولی مدت اعتبارشون 1 سال هست ولی گواهینامه های رایگان مدتش 90 روزه که می شه دوباره تمدید کردخب بریم سراغ آموزش ما در این پست می خوایم از Let's Encrypt استفاده کنیم ما داخل سرور ممکنه چندن دامنه و ساب دامنه داشته باشه که برای هر کدوم باید جداگانه نصب کنیم https رو. اول apache رو نصب می کنیم یا اگه نصب بررسی می کنیم که نسخه چنده رو نصب کردیم می توانید از دستور برای بررسی نصب بودن روی سرور چک کنید :apache2-v و اگه نصب نیست با این دستور نصب کنید :sudo apt install apache2 بعد از نصب بررسی می کنیم که نصب شده و فعال هست :sudo systemctl status apache2 خب یک پوشه ایجاد می کنیم sudo mkdir/var/www/html/api.ir داخل پوشه api.ir به فایل به نام index.html ایجاد می کنیم که محتواش می تونه هر چی باشه:sudo nano/var/www/html/api.ir/index.html داخل فایل : https://virgool.io/d/g4tsvpbzgrzj/edit خب یه فایل server block برای دامنه ایجاد می کنیم:sudo nano/etc/apache2/sites-available/api.ir.conf و داخلش این تنظیمات مربوط به server block رو کپی می کنیم :ServerAdminadmin@example.com ServerName api.ir ServerAlias www.api.ir DocumentRoot/var/www/html/api.ir و با این دستور این server block رو به پوشه اس site-enable لینک می کنیم :ln -s /etc/apache2/sites-available/api.ir/ etc/apache2/sites-enabled/api.ir سیستم کلی وب سرور اینجوری که یه پوشه برای سایت ها و دامنه ای در دسترس وجود و هر کدوم رو خواستم لینک می کنیم به پوشه سایت های فعال حتی nginx هم این روند رو دارهحالا تنظیمات مربوط به وب سرور تموم هست می ریم Let's Encrypt رو نصب کنیمsudo apt install certbot بعد از نصب برای اینکه بتوانیم از پلاگین webroot استفاده کنیم یک پوشه ایجاد می کنیم بعد سطح دسترسی به اون رو تغییر می دیم:sudo mkdir -p /var/lib/letsencrypt/.well-known sudo chgrp www-data/var/lib/letsencrypt sudo chmod g+s /var/lib/letsencrypt https://virgool.io/d/g4tsvpbzgrzj/sudomkdir-p/var/lib/letsencrypt/.well-knownsudochgrpwww-data/var/lib/letsencryptsudochmodg+s/var/lib/letsencrypt sudo nano /etc/apache2/conf-available/well-known.conf و داخلش این دستورات رو کپی می کنیم و در اخر ذخیره می کنیم و از فایل بیرون می ایم Alias/.well-known/acme-challengeهمه ای دامنه ها به یه ip آدرسی که مربوط به سرور هست اشاره می کنند و بعد از رسیدن به سرور این apache هست که این درخواست رو هندل می کنه و برای اینکه برای این درخواست ها گواهینامه ssl رو فعال کنیم باید این کامند ها رو اجرا کنیم sudo a2enmod ssl sudo a2enmod headers sudo a2enmod http2 sudo a2enconf well-knownبعد از فعال کردن apache رو ریستارت می کنیم sudo systemctl restart apache2 خب بعد از اینکه گواهینامه ssl رو فعال کردیم باید برای هر دامنه یا ساب دامنه یک بار https رو نصب کنیم ما اینجا یک دامنه به آدرس api.ir ایجاد کردیم که بدین صورت خواهد بودsudo certbot certonly --agree-tos --email admin@api.ir --webroot -w /var/lib/letsencrypt/ -d api.ir -d www.api.ir اگه درست نصب شده باشه باید با خروجی زیر رو به رو بشیم که می گه تبریک با موفقیت نصب شده importantnotes:-Congratulations!Yourcertificateandchainhavebeensavedat:/etc/letsencrypt/live/api.ir/fullchain.pemYourkeyfilehasbeensavedat:/etc/letsencrypt/live/api.ir/privkey.pemYourcertwillexpireon2020-06-27.Toobtainanewortweakedversionofthiscertificateinthefuture,simplyruncertbotagain.Tonon-interactivelyrenew*all*ofyourcertificates,run خب برای اینکه بخواهیم تبادل اطلاعات بین کاربر و سرور به صورت رمز نگاری شده باشد باید یک کلید تبادل به مقدار 2048 تولید کنیمsudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048دوباره فایل server block که برای دامنه api.ir ایجاد کرده بودیم رو باز می کنیم و به این صورت ویراش می کنیم <VirtualHost *:80> ServerAdmin admin@example.com ServerName api.ir ServerAlias www.api.ir DocumentRoot /var/www/html/api.ir ErrorLog ${APACHE_LOG_DIR}/api.ir-error.log </VirtualHost> <VirtualHost *:443> ServerName api.ir ServerAlias www.api.ir DocumentRoot /var/www/html/api.ir Protocols h2 http:/1.1 <If &quot%{HTTP_HOST} == 'www.api.ir'&quot> Redirect permanent / https://api.ir/ </If> ErrorLog ${APACHE_LOG_DIR}/api.ir-error.log CustomLog ${APACHE_LOG_DIR}/api.ir-access.log combined SSLEngine On SSLCertificateFile /etc/letsencrypt/live/api.ir/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/api.ir/privkey.pem SSLOpenSSLConfCmd DHParameters &quot/etc/ssl/certs/dhparam.pem&quot SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCompression off SSLUseStapling on </VirtualHost>برای اینکه پروتکل https هم بتونه اطلاعات رو کش کنه و از کش بخونه باید تنظیمات مربوط به ان را توی تنظیمات apache فعال کنیم فایل ssl.conf رو باز می کنیم :sudo nano /etc/apache2/mods-available/ssl.confبعد دارکتیو SSLStaplingCache رو اضافه می کنیم # Set the location of the SSL OCSP Stapling Cache SSLStaplingCache shmcb:/tmp/stapling_cache(128000) و مرحله ای آخر apache رو ریستارت می کنیمsudo systemctl restart apache2برای اینکه هر 30 روز به صورت خودکار اعتبار گواهینامه دوباره تمدید بشه البته گفتم مدت اعتبارش 90 روزه داخل cronjob این دستور رو اضافه می کنیم :0 1 * * * /usr/bin/certbot renew & > /dev/nullبرای اینکه تست کنیم تمدید تاریخ اعتبار به درستی کار می کنه یه بار دستی تست می کنیمsudo certbot renew --dry-runتبریک می گم شما تونستید گواهینامه SSL رو روی دامنه خود نصب کنید و از این به بعد ارتباط بین سرور و کاربر شما به صورت امن و رمز نگاری خواهد شد .