بلاگ/وب سرور آپاچی با گواهی رایگان Let’s Encrypt روی CentOS 8
به‌روز شده

وب سرور آپاچی با گواهی رایگان Let’s Encrypt روی CentOS 8

Let’s Encrypt یک صادر کننده گواهی رایگان، خودکار و باز برای وب سایت، ایمیل سرور و... شما است. ما در این مطلب به نحوه ایمن‌سازی وب‌سرور آپاچی با گواهی SSL رایگان Let’s Encrypt می‌پردازیم. در این راستا، ابتدا با استفاده از Let’s Encrypt یک گواهی SSL رایگان روی وب‌سرور آپاچی نصب می‌کنیم. سپس با هم...

1398/10/305100 بازدید
وب سرور آپاچی با گواهی رایگان Let’s Encrypt روی CentOS 8
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 نصب کنید:
php
sudo yum install mod_ssl
2) دستور زیر را اجرا کرده و نرم‌افزار acme.sh را دریافت کنید:
php
git clone https://github.com/Neilpang/acme.sh.git
3) با اجرای دستور زیر یک دایرکتوری جدید با آدرس مشخص شده در ضمن دستور ایجاد کنید:
php
mkdir -p /var/www/html/.well-known/acme-challenge/
4) یک گواهی SSL رایگان برای دامنه خودتان ایجاد کنید:
php
acme.sh --issue -w /DocumentRootPath/ -d your-domain
5) TLS/SSL را برای آپاچی در CentOS 8 کانفیگ کنید:
php
vi /etc/httpd/conf.d/ssl.conf
6) یک کرون جاب (Cron Job) برای تمدید خودکار گواهی SSL/TLS ایجاد کنید. 7) با استفاده از فایروال پورت 443 (HTTPS) را باز کنید:
php
sudo firewall-cmd --add-service=https

با توجه به شکل زیر می‌توانید "تنظیمات نمونه" مورد استفاده در تهیه این مطلب را ببینید. همانطور که مشاهده می‌کنید، در این مورد قرار است که گواهی SSL رایگان Let’s Encrypt، امنیت وب‌سرور آپاچی را روی CentOS 8 تضمین کند. تنظیمات نمونه حالا برویم سراغ نصب acme.sh client و استفاده از آن در CentOS 8 برای تهیه یک گواهی SSL رایگان! اما قبل از هر چیزی اول تمامی پچ‌ها را با اجرای دستور زیر اپلای کنید:
php
sudo yum update

گام اول - نصب mod_ssl برای آپاچی:
دستور yum زیر را اجرا کنید:
php
$ 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 نصب داشته باشید. در غیر اینصورت لازمه که حتما آن‌ها را با اجرای دستور زیر نصب نمایید:
php
$ sudo yum install wget curl bc git socat
خروجی:
php
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 kInstalling 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 MInstalled size: 38 MIs this ok [y/N]: y
کلون کردن ریپازیتوری:
برای کلون کردن ریپازیتوری acme.sh از گیت‌هاب، دستورات زیر را اجرا کنید:
php
$ cd /tmp/$ git clone https://github.com/Neilpang/acme.sh.git
سپس، با اجرای دستورات زیر، کلاینت acme.sh را روی سیستم نصب کنید:
php
$ cd acme.sh/$ sudo -i# cd acme.sh/# ./acme.sh --install
نصب کلاینت acme.sh در راستای ایمن سازی آپاچی با گواهی Let’s Encrypt اکنون ما به این نرم‌افزار روی سرور CentOS 8 نیاز داریم. شما باید ترمینال فعلی و یا سِشن ssh را ببندید و دوباره باز نمایید تا تغییرات اعمال شوند. راه دیگر این است که فرمان زیر را اجرا کنید:
php
$ sudo source ~/.bashrc
با اجرای فرمان زیر اطمینان حاصل کنید که acme.sh بدرستی نصب شده و کار می‌کند:
php
# acme.sh --version
خروجی نمونه:
php
https://github.com/Neilpang/acme.shv2.8.3

گام سوم - ایجاد دایرکتوری acme-challeng
فرمان mkdir زیر را اجرا کنید. اما پیش از اجرای فرمان، مطمئن شوید که D$ را روی مسیر واقعی DocumentRoot در سرور خود تنظیم کرده‌اید:
php
# 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 رایگان ایجاد کنید:
php
# mkdir -p /etc/httpd/ssl/cyberciti.biz/

گام چهارم - فایل dhparams.pem را ایجاد نمایید
فرمان openssl را اجرا کنید:
php
# cd /etc/httpd/ssl/cyberciti.biz/# openssl dhparam -out dhparams.pem -dsaparam 4096
خروجی فرمان openssl
در صورت فعال نبودن سرویس آپاچی؛ آن را روشن نمایید
در صورتی که سرویس آپاچی فعال نباشد، می‌توانید با استفاده از دستور systemctl آن را روشن نمایید:
php
$ 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 به روش زیر استفاده کنید:
php
$ sudo firewall-cmd --permanent --add-service=http --zone=public$ sudo firewall-cmd --reload$ sudo firewall-cmd --list-services --zone=public

گام پنجم - یک گواهی SSL / TLS برای دامنه خود صادر کنید
برای صدور گواهی به روش زیر عمل کنید:
php
# 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 ویرایش کنید:
php
$ sudo vi /etc/httpd/conf.d/ssl.conf
تغییراتی که باید انجام بدید به شرح زیر هستند:
php
### Start config for port 443 #Listen 443 httpsSSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialogSSLSessionCache         shmcb:/run/httpd/sslcache(512000)SSLSessionCacheTimeout  300SSLCryptoDevice builtin ### Turn on HTTP2 support #Protocols h2 http/1.1 ### Redirect all http urls to https #RewriteEngine OnRewriteCond %{HTTPS} offRewriteRule (.*) 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 configSSLUseStapling          onSSLStaplingResponderTimeout 5SSLStaplingReturnResponderErrors offSSLStaplingCache        shmcb:/var/run/ocsp(128000)
فایل را ذخیره کرده و از ادیتور vim خارج شوید.
نکته‌ای برای امن‌تر شدن تنظیمات SSL
شما می‌تونید برای اینکه SSL امن‌تری داشته باشید، در کانفیگ آپاچی SSL و TLS ورژن 1/1.1 را غیر فعال کنید. کانفیگ زیر تقریبا برای همه سیستم‌هایی که وب‌سرور آپاچی را با اهداف و کاربران گوناگونی اجرا می‌کنند، توصیه می‌شود:
php
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1SSLHonorCipherOrder offSSLCipherSuite 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 رایگان
فرمان زیر را اجرا کنید:
php
# 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 های تعریف شده در فایروال را بصورت زیر بروز رسانی کنید:
php
$ 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 به روش زیر استفاده کنید:
php
$ sudo ss -tulpn$ sudo ss -tulpn | egrep ':(80|443)'
نمونه خروجی:
php
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 بسازید:
php
sudo vi /var/www/html/index.html
داخل فایل index.html کد‌های HTML زیر را وارد نمایید:
php
<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 دستور زیر را اجرا کنید:
php
# acme.sh --list
مجوز دامنه به نام server2.ariaservice.net را تمدید کنید:
php
# acme.sh --renew -d server2.ariaservice.net
توجه داشته باشید که یک کرون جاب (Cron Job) همین کار تمدید گواهی را برای شما انجام می‌دهد. این کرون جاب بصورت پیش‌فرض نصب و فعال می‌باشد و نیازی نیست که کار خاصی برای فعال کردن آن انجام دهید. برای مشاهده آن می‌توانید دستور زیر را اجرا نمایید:
php
# crontab -l
خروجی نمونه:
php
38 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
acme.sh کلاینت را آپگرید کنید:
php
# acme.sh --upgrade
برای دسترسی به help دستور زیر را اجرا کنید:
php
# acme.sh --help | more

جمع‌بندی:
شما در این آموزش با نحوه نصب گواهی SSL/TSL رایگانِ Let’s Encrypt آشنا شدید و توانستید از این طریق ارتباطات بین وب‌سرور آپاچی و کلاینت‌هایی که از طریق مرورگر با وب‌سایت شما در تعامل هستند را ایمن کنید. تبریک می‌گوییم! همواره ایمن باشید...