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

 

اولین گام برای ایمن سازی آپاچی با گواهی Let’s Encrypt - نصب ssl-mode


گام دوم – نصب 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

نصب کلاینت acme.sh در راستای ایمن سازی آپاچی با گواهی Let’s Encrypt

اکنون ما به این نرم‌افزار روی سرور 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

خروجی فرمان openssl

در صورت فعال نبودن سرویس آپاچی؛ آن را روشن نمایید

در صورتی که سرویس آپاچی فعال نباشد، می‌توانید با استفاده از دستور systemctl آن را روشن نمایید:

$ sudo systemctl status httpd.service
$ sudo systemctl enable httpd.service
$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service

روشن کردن سرویس Apache

از باز بودن پورت 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 برای دامنه


گام ششم – کانفیگ آپاچی برای استفاده از 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'

نصب گواهی SSL


گام هشتم – کانفیگ فایروال 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

تست آپاچی با گواهی Let's Encrypt

داخل SSLlabs هم یک تست بگیرید:

تست در سایت 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 آشنا شدید و توانستید از این طریق ارتباطات بین وب‌سرور آپاچی و کلاینت‌هایی که از طریق مرورگر با وب‌سایت شما در تعامل هستند را ایمن کنید. تبریک می‌گوییم! همواره ایمن باشید…