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

در پست می خوایم نحوه ای نصب کردن گواهی نامه SSL یا همون https روی سرور های لینوکس بر روی وب سرور apache رو آموزش بدم و در پست بعدی نحوه ای نصب روی وب سرور nginx اموزش خواهم داد.

اینکه https چیه و چه مزایای نسبت به http داره می تونید از این لینک در موردش بخونید و در یک جمله اینو بگم که فرق بین http و https اینکه در پروتکل ارتباطی https ارتباط بین کاربر و سرور به صورت امن خواهد بود و از نظر سئو هم تاثیر داره بر روی سایت.

فرق بین https با http
فرق بین 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 رو روی دامنه خود نصب کنید و از این به بعد ارتباط بین سرور و کاربر شما به صورت امن و رمز نگاری خواهد شد .