لیدتک توسعه هوشمند نرم‌افزار

نصب و فعال‌سازی HTTPS روی Apache در لینوکس

قفل HTTPS و گواهی SSL روی وب‌سرور Apache

در این مقاله می‌خواهیم نحوه نصب گواهی‌نامه SSL (همان HTTPS) روی سرورهای لینوکسی و وب‌سرور Apache را مرحله به مرحله مرور کنیم.

فرق http و https در یک جمله این است که در پروتکل https ارتباط میان کاربر و سرور رمزنگاری‌شده و امن است؛ ضمن اینکه از نظر سئو هم روی رتبه سایت تأثیر مثبت دارد.

یکی از راه‌های فعال‌سازی https، خرید گواهی‌نامه SSL یا TLS از یک مرجع معتبر است؛ بعد از خرید سه فایل تحویل می‌گیرید که آن‌ها را روی سرور یا سرویس CDN آپلود می‌کنید. اما در این مقاله سراغ گواهی‌نامه رایگان Let's Encrypt می‌رویم.

TLS در واقع نسخه ارتقایافته SSL است؛ نسخه SSL 3.1 همان TLS 1.0 است و در هر به‌روزرسانی امکانات امنیتی تازه‌ای اضافه می‌شود. نکته دیگر اینکه اعتبار گواهی‌نامه‌های پولی معمولاً یک‌ساله و گواهی‌نامه‌های رایگان ۹۰ روزه است که قابل تمدید هستند.

۱. نصب و بررسی Apache

اول بررسی می‌کنیم Apache نصب است یا نه و چه نسخه‌ای دارد:

apache2 -v

اگر نصب نبود، آن را نصب می‌کنیم:

sudo apt install apache2

و بعد از نصب، وضعیت سرویس را بررسی می‌کنیم:

sudo systemctl status apache2

۲. ساخت دایرکتوری دامنه

برای دامنه‌ای که می‌خواهیم روی آن https فعال کنیم (اینجا به‌عنوان مثال api.ir) یک پوشه می‌سازیم:

sudo mkdir /var/www/html/api.ir

و داخل آن یک فایل index.html با هر محتوایی که دوست دارید ایجاد می‌کنیم:

sudo nano /var/www/html/api.ir/index.html

۳. ساخت Server Block

حالا یک فایل server block برای دامنه می‌سازیم:

sudo nano /etc/apache2/sites-available/api.ir.conf

و تنظیمات زیر را داخل آن قرار می‌دهیم:

ServerAdmin admin@example.com
ServerName api.ir
ServerAlias www.api.ir
DocumentRoot /var/www/html/api.ir

سپس این server block را به پوشه sites-enabled لینک می‌کنیم:

ln -s /etc/apache2/sites-available/api.ir.conf /etc/apache2/sites-enabled/api.ir.conf

ساختار کلی وب‌سرور این‌طور است که یک پوشه برای سایت‌های در دسترس وجود دارد و هرکدام را که بخواهیم فعال کنیم، به پوشه سایت‌های فعال لینک می‌کنیم. Nginx هم دقیقاً همین روند را دارد.

۴. نصب Certbot و آماده‌سازی webroot

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

سپس فایل کانفیگ well-known را می‌سازیم:

sudo nano /etc/apache2/conf-available/well-known.conf

و مقدار Alias را داخل آن قرار می‌دهیم:

Alias /.well-known/acme-challenge/ /var/lib/letsencrypt/.well-known/acme-challenge/

۵. فعال‌سازی ماژول‌های SSL

همه دامنه‌ها به IP سرور اشاره می‌کنند و این Apache است که درخواست‌ها را هندل می‌کند. برای فعال کردن SSL روی این درخواست‌ها ماژول‌های زیر را فعال می‌کنیم:

sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod http2
sudo a2enconf well-known

و بعد Apache را ری‌استارت می‌کنیم:

sudo systemctl restart apache2

۶. گرفتن گواهی‌نامه برای دامنه

برای هر دامنه یا ساب‌دامنه باید یک‌بار گواهی‌نامه بگیریم:

sudo certbot certonly --agree-tos --email admin@api.ir \
  --webroot -w /var/lib/letsencrypt/ \
  -d api.ir -d www.api.ir

اگر همه‌چیز درست باشد، خروجی به شما تبریک می‌گوید و مسیر ذخیره گواهی‌نامه و کلید خصوصی و تاریخ انقضا را نشان می‌دهد:

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/api.ir/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/api.ir/privkey.pem

۷. ساخت کلید تبادل Diffie-Hellman

برای اینکه تبادل اطلاعات میان کاربر و سرور رمزنگاری‌شده باشد، یک کلید ۲۰۴۸ بیتی می‌سازیم:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

۸. ویرایش Server Block برای HTTPS

حالا همان فایل server block دامنه را باز می‌کنیم و به این شکل ویرایش می‌کنیم:

<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 "%{HTTP_HOST} == 'www.api.ir'">
        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 "/etc/ssl/certs/dhparam.pem"

    SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
    SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLCompression off
    SSLUseStapling on
</VirtualHost>

۹. فعال‌سازی کش OCSP Stapling

برای اینکه پروتکل https هم بتواند اطلاعات را کش کند، فایل 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

۱۰. تمدید خودکار گواهی‌نامه

اعتبار گواهی‌نامه رایگان ۹۰ روزه است؛ برای تمدید خودکار، این دستور را به cronjob اضافه می‌کنیم:

0 1 * * * /usr/bin/certbot renew &> /dev/null

و برای اطمینان از درست کار کردن تمدید، یک‌بار به‌صورت دستی تست می‌کنیم:

sudo certbot renew --dry-run

تبریک می‌گویم؛ گواهی‌نامه SSL روی دامنه شما نصب شد و از این به بعد ارتباط میان سرور و کاربر رمزنگاری‌شده و امن خواهد بود.