Let’s Encrypt یک صادر کننده گواهی رایگان، خودکار و باز برای وب سایت، ایمیل سرور و… شما است. ما در این مطلب به نحوه ایمنسازی وبسرور آپاچی با گواهی SSL رایگان Let’s Encrypt میپردازیم.
در این راستا، ابتدا با استفاده از Let’s Encrypt یک گواهی SSL رایگان روی وبسرور آپاچی نصب میکنیم. سپس با هم میبینیم که چطور میشود با استقرار صحیح Diffie-Hellman روی سرور، در SSL labs نمره +A کسب کرد. لازم به ذکر است که سیستم عامل سرور مورد استفاده برای تهیه این مطلب CentOS Linux 8 است.
نجوه ایمن سازی آپاچی با گواهی SSL رایگان Let’s Encrypt در CentOS 8:
مراحل دریافت گواهی SSL رایگان به شرح زیر است:
1) ماژول SSL/TLS را برای آپاچی اچتیپیپی سرور در CentOS 8 نصب کنید:
sudo yum install mod_ssl
2) دستور زیر را اجرا کرده و نرمافزار acme.sh را دریافت کنید:
git clone https://github.com/Neilpang/acme.sh.git
3) با اجرای دستور زیر یک دایرکتوری جدید با آدرس مشخص شده در ضمن دستور ایجاد کنید:
mkdir -p /var/www/html/.well-known/acme-challenge/
4) یک گواهی SSL رایگان برای دامنه خودتان ایجاد کنید:
acme.sh --issue -w /DocumentRootPath/ -d your-domain
5) TLS/SSL را برای آپاچی در CentOS 8 کانفیگ کنید:
vi /etc/httpd/conf.d/ssl.conf
6) یک کرون جاب (Cron Job) برای تمدید خودکار گواهی SSL/TLS ایجاد کنید.
7) با استفاده از فایروال پورت 443 (HTTPS) را باز کنید:
sudo firewall-cmd --add-service=https
با توجه به شکل زیر میتوانید “تنظیمات نمونه” مورد استفاده در تهیه این مطلب را ببینید. همانطور که مشاهده میکنید، در این مورد قرار است که گواهی SSL رایگان Let’s Encrypt، امنیت وبسرور آپاچی را روی CentOS 8 تضمین کند.
حالا برویم سراغ نصب acme.sh client و استفاده از آن در CentOS 8 برای تهیه یک گواهی SSL رایگان! اما قبل از هر چیزی اول تمامی پچها را با اجرای دستور زیر اپلای کنید:
sudo yum update
گام اول – نصب mod_ssl برای آپاچی:
دستور yum زیر را اجرا کنید:
$ sudo yum install mod_ssl
گام دوم – نصب acme.sh Let’s Encrypt client
به منظور اجرای acme.sh شما باید wget, curl, bc, socat و git را روی CentOS 8 نصب داشته باشید. در غیر اینصورت لازمه که حتما آنها را با اجرای دستور زیر نصب نمایید:
$ sudo yum install wget curl bc git socat
خروجی:
Last metadata expiration check: 0:06:51 ago on Wednesday 02 October 2019 05:49:51 PM UTC. Package wget-1.19.5-7.el8_0.1.x86_64 is already installed. Package curl-7.61.1-8.el8.x86_64 is already installed. Dependencies resolved. ========================================================================================= Package Arch Version Repository Size ========================================================================================= Installing: git x86_64 2.18.1-3.el8 AppStream 186 k socat x86_64 1.7.3.2-6.el8 AppStream 298 k bc x86_64 1.07.1-5.el8 BaseOS 129 k Installing dependencies: git-core x86_64 2.18.1-3.el8 AppStream 4.1 M git-core-doc noarch 2.18.1-3.el8 AppStream 2.3 M perl-Error noarch 1:0.17025-2.el8 AppStream 46 k perl-Git noarch 2.18.1-3.el8 AppStream 77 k perl-TermReadKey x86_64 2.37-7.el8 AppStream 40 k emacs-filesystem noarch 1:26.1-5.el8 BaseOS 69 k Transaction Summary ========================================================================================= Install 9 Packages Total download size: 7.1 M Installed size: 38 M Is this ok [y/N]: y
کلون کردن ریپازیتوری:
برای کلون کردن ریپازیتوری acme.sh از گیتهاب، دستورات زیر را اجرا کنید:
$ cd /tmp/ $ git clone https://github.com/Neilpang/acme.sh.git
سپس، با اجرای دستورات زیر، کلاینت acme.sh را روی سیستم نصب کنید:
$ cd acme.sh/ $ sudo -i # cd acme.sh/ # ./acme.sh --install
اکنون ما به این نرمافزار روی سرور CentOS 8 نیاز داریم. شما باید ترمینال فعلی و یا سِشن ssh را ببندید و دوباره باز نمایید تا تغییرات اعمال شوند. راه دیگر این است که فرمان زیر را اجرا کنید:
$ sudo source ~/.bashrc
با اجرای فرمان زیر اطمینان حاصل کنید که acme.sh بدرستی نصب شده و کار میکند:
# acme.sh --version
خروجی نمونه:
https://github.com/Neilpang/acme.sh v2.8.3
گام سوم – ایجاد دایرکتوری acme-challeng
فرمان mkdir زیر را اجرا کنید. اما پیش از اجرای فرمان، مطمئن شوید که D$ را روی مسیر واقعی DocumentRoot در سرور خود تنظیم کردهاید:
# D=/var/www/html/ # mkdir -vp ${D}/.well-known/acme-challenge/ ###---[ NOTE: Adjust permission as per your setup ]---### # chown -R apache:apache ${D}/.well-known/acme-challenge/ # chmod -R 0555 ${D}/.well-known/acme-challenge/
همچنین یک دایرکتوری به منظور ذخیره گواهی SSL رایگان ایجاد کنید:
# mkdir -p /etc/httpd/ssl/cyberciti.biz/
گام چهارم – فایل dhparams.pem را ایجاد نمایید
فرمان openssl را اجرا کنید:
# cd /etc/httpd/ssl/cyberciti.biz/ # openssl dhparam -out dhparams.pem -dsaparam 4096
در صورت فعال نبودن سرویس آپاچی؛ آن را روشن نمایید
در صورتی که سرویس آپاچی فعال نباشد، میتوانید با استفاده از دستور systemctl آن را روشن نمایید:
$ sudo systemctl status httpd.service $ sudo systemctl enable httpd.service $ sudo systemctl start httpd.service $ sudo systemctl status httpd.service
از باز بودن پورت TCP 80 اطمینان حاصل کنید
برای باز کردن این پورت در CentOS 8 از فرمان firewall-cmd به روش زیر استفاده کنید:
$ sudo firewall-cmd --permanent --add-service=http --zone=public $ sudo firewall-cmd --reload $ sudo firewall-cmd --list-services --zone=public
گام پنجم – یک گواهی SSL / TLS برای دامنه خود صادر کنید
برای صدور گواهی به روش زیر عمل کنید:
# acme.sh --issue -w /path/to/www/htmlRoot/ -d your-domain-example-com -k 2048 # acme.sh --issue -w /path/to/www/htmlRoot/ -d www.cyberciti.biz -k 4096 # acme.sh --issue -w /var/www/html/ -d centos8.cyberciti.biz -k 4096
گام ششم – کانفیگ آپاچی برای استفاده از SSL/TLS
فایل etc/httpd/conf.d/ssl.conf را بوسیله یک ویرایشگر متن از قبیل فرمان vi ویرایش کنید:
$ sudo vi /etc/httpd/conf.d/ssl.conf
تغییراتی که باید انجام بدید به شرح زیر هستند:
### Start config for port 443 # Listen 443 https SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog SSLSessionCache shmcb:/run/httpd/sslcache(512000) SSLSessionCacheTimeout 300 SSLCryptoDevice builtin ### Turn on HTTP2 support # Protocols h2 http/1.1 ### Redirect all http urls to https # RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,QSA] ################################################# # SSL/TLS config for domain centos8.cyberciti.biz # ################################################# <VirtualHost centos8.cyberciti.biz:443> ### Log files # ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn SSLEngine on ### No more SSL3/2 # SSLProtocol all -SSLv3 SSLHonorCipherOrder on SSLCompression off SSLSessionTickets off SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS ### Path to certs # SSLCertificateFile /etc/httpd/ssl/cyberciti.biz/centos8.cyberciti.biz.cer SSLCertificateKeyFile /etc/httpd/ssl/cyberciti.biz/centos8.cyberciti.biz.key #Forward Secrecy & Diffie Hellman ephemeral parameters SSLOpenSSLConfCmd DHParameters "/etc/httpd/ssl/cyberciti.biz/dhparams.pem" # HSTS (mod_headers is required) (15768000 seconds = 6 months) Header always set Strict-Transport-Security "max-age=15768000" <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory "/var/www/cgi-bin"> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-5]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost> ### OCSP stapling config SSLUseStapling on SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off SSLStaplingCache shmcb:/var/run/ocsp(128000)
فایل را ذخیره کرده و از ادیتور vim خارج شوید.
نکتهای برای امنتر شدن تنظیمات SSL
شما میتونید برای اینکه SSL امنتری داشته باشید، در کانفیگ آپاچی SSL و TLS ورژن 1/1.1 را غیر فعال کنید. کانفیگ زیر تقریبا برای همه سیستمهایی که وبسرور آپاچی را با اهداف و کاربران گوناگونی اجرا میکنند، توصیه میشود:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder off SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
برای کسب اطلاعات بیشتر میتوانید به این لینک مراجعه کنید.
گام هفتم – نصب گواهی SSL رایگان
فرمان زیر را اجرا کنید:
# acme.sh --installcert -d centos8.cyberciti.biz \ --keypath /etc/httpd/ssl/cyberciti.biz/centos8.cyberciti.biz.key \ --fullchainpath /etc/httpd/ssl/cyberciti.biz/centos8.cyberciti.biz.cer \ --reloadcmd 'systemctl reload httpd'
گام هشتم – کانفیگ فایروال CentOS 8 برای باز کردن پورت تیسیپی 443 (HTTPS)
حالا که وبسرور آپاچی ما با mod_ssl بالا آمده و در حال اجرا است، وقت این رسیده که TCP port 443 را روی سرور CentOS 8 باز کنیم. بدین ترتیب کلاینتها امکان اتصال به این پورت را خواهند یافت.
rule های تعریف شده در فایروال را بصورت زیر بروز رسانی کنید:
$ sudo firewall-cmd --permanent --add-service=https --zone=public $ sudo firewall-cmd --reload $ sudo firewall-cmd --list-services --zone=public
اطمینان حاصل کنید که پورتهای 80 و 443 باز هستند. شما برای لیست کردن وضعیت پورتهای مد نظرتان میتونید از فرمان ss به همراه فرمان grep/egrep به روش زیر استفاده کنید:
$ sudo ss -tulpn $ sudo ss -tulpn | egrep ':(80|443)'
نمونه خروجی:
tcp LISTEN 0 128 *:443 *:* users:(("httpd",pid=12079,fd=9),("httpd",pid=12078,fd=9),("httpd",pid=12077,fd=9),("httpd",pid=10782,fd=9)) tcp LISTEN 0 128 *:80 *:* users:(("httpd",pid=12079,fd=4),("httpd",pid=12078,fd=4),("httpd",pid=12077,fd=4),("httpd",pid=10782,fd=4))
گام نهم – تست
یک صفحه تست با نام index.html بسازید:
sudo vi /var/www/html/index.html
داخل فایل index.html کدهای HTML زیر را وارد نمایید:
<html> <head> <title>CentOS8 Apache test server - nixCraft</title> </head> <body> <h2>Hello, world!</h2> <p> I run on CentOS Linux 8. I act as a testbed for nixCraft test lab. I exist to help sysadmins and developers to help learn CentOS 8. </p> <hr> <small>Apache 2 server running on CentOS 8 with Let's Encrypt</small> </body> </html>
سپس فایل را ذخیره کرده و ببندید. حالا یک مرورگر باز کنید و دامنه خودتان را وارد کنید، مانند: https://centos8.cyberciti.biz
داخل SSLlabs هم یک تست بگیرید:
گام دهم – دستورات acme.sh
برای لیست کردن تمام گواهینامههای SSL/TLS دستور زیر را اجرا کنید:
# acme.sh --list
مجوز دامنه به نام server2.ariaservice.net را تمدید کنید:
# acme.sh --renew -d server2.ariaservice.net
توجه داشته باشید که یک کرون جاب (Cron Job) همین کار تمدید گواهی را برای شما انجام میدهد. این کرون جاب بصورت پیشفرض نصب و فعال میباشد و نیازی نیست که کار خاصی برای فعال کردن آن انجام دهید. برای مشاهده آن میتوانید دستور زیر را اجرا نمایید:
# crontab -l
خروجی نمونه:
38 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
acme.sh کلاینت را آپگرید کنید:
# acme.sh --upgrade
برای دسترسی به help دستور زیر را اجرا کنید:
# acme.sh --help | more
جمعبندی:
شما در این آموزش با نحوه نصب گواهی SSL/TSL رایگانِ Let’s Encrypt آشنا شدید و توانستید از این طریق ارتباطات بین وبسرور آپاچی و کلاینتهایی که از طریق مرورگر با وبسایت شما در تعامل هستند را ایمن کنید. تبریک میگوییم! همواره ایمن باشید…