صفحه باز می‌شود، اما مرورگر هشدار گواهی می‌دهد. حذف هشدار از راه خاموش کردن بررسی، مشکل اعتماد را حل نمی‌کند. امشب Apache را با گواهی آزمایشگاه راه می‌اندازیم و نام، زنجیره و نسخهٔ TLS را جدا بررسی می‌کنیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: srv با Ubuntu 24.04؛ Apache 2.4، OpenSSL 3 و curl؛ گواهی سالم و کلید شب پنجم.

جایگاه در دوره: هدف‌های 331.2 آزمون 303-300.

سه لایهٔ یک ارتباط#

TLS ارتباط را محافظت می‌کند؛ گواهی به احراز هویت سرور کمک می‌کند؛ HTTP همچنان قواعد برنامه را دارد. SNI نام سرویس را هنگام مذاکرهٔ TLS می‌فرستد تا یک IP چند گواهی داشته باشد. هدر Host بعداً در HTTP می‌آید. انتخاب گواهی با SNI را با انتخاب مسیر برنامه اشتباه نگیر.

روی VM اختصاصی وب، بستهٔ apache2 را نصب کن و فایل‌های آزمایشگاهی شب پنجم را در حساب خود داشته باش. فقط server.key، server.crt و ca.crt لازم‌اند؛ کلید CA به وب‌سرور منتقل نمی‌شود.

sudo install -d -m 755 /etc/apache2/lpic303
sudo install -m 600 ~/lpic303/pki/server.key /etc/apache2/lpic303/server.key
sudo install -m 644 ~/lpic303/pki/server.crt /etc/apache2/lpic303/server.crt
sudo install -m 644 ~/lpic303/pki/ca.crt /etc/apache2/lpic303/ca.crt
sudo a2enmod ssl headers

فایل /etc/apache2/sites-available/lpic303.conf را بساز:

<VirtualHost *:443>
    ServerName library.example.test
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile /etc/apache2/lpic303/server.crt
    SSLCertificateKeyFile /etc/apache2/lpic303/server.key
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    SSLCipherSuite SSL ECDHE+AESGCM:ECDHE+CHACHA20
    SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256
    Header always set Strict-Transport-Security "max-age=300"
</VirtualHost>

Cipher suite مجموعهٔ الگوریتم‌های مذاکره‌شدهٔ TLS است. در این نمونه، تنظیم suiteهای TLS 1.2 و TLS 1.3 جدا نوشته شده است؛ نام‌ها را باید با قابلیت OpenSSL نصب‌شده تطبیق بدهی. SSLv2، SSLv3 و TLS 1.0/1.1 را برای سازگاری با کلاینت قدیمی فعال نمی‌کنیم. حفظ نام الگوریتم‌ها هدف درس نیست؛ باید بدانی انتخاب suite و اجازهٔ نسخهٔ پروتکل دو تصمیم جدا هستند.

بستهٔ Ubuntu با فعال شدن mod_ssl معمولاً Listen 443 را در ports.conf دارد؛ آن را دوباره اضافه نکن. ابتدا پیکربندی و سپس سرویس:

sudo a2ensite lpic303
sudo apache2ctl configtest
sudo systemctl reload apache2
curl --cacert ~/lpic303/pki/ca.crt \
  --resolve library.example.test:443:192.168.56.10 \
  -I https://library.example.test/

انتظار داریم بررسی گواهی موفق شود و هدر HSTS دیده شود. HSTS دستور مرورگر برای استفاده از HTTPS در مراجعه‌های آینده است؛ زمان کوتاه این تمرین برای برگشت آسان‌تر است. includeSubDomains و preload را بدون آمادگی تمام نام‌ها اضافه نکن.

آزمایش مثبت و منفی#

openssl s_client -connect 192.168.56.10:443 \
  -servername library.example.test -verify_hostname library.example.test \
  -CAfile ~/lpic303/pki/ca.crt -verify_return_error </dev/null

نام بررسی‌شده را به wrong.example.test تغییر بده: باید شکست بخورد. سپس curl را بدون CA خصوصی اجرا کن؛ مگر CA قبلاً در trust store نصب شده باشد، باید خطای اعتماد بدهد. -k را به «حل مسئله» تبدیل نکن.

برای CA دارای responder معتبر، SSLUseStapling On و یک SSLStaplingCache در سطح global، ارسال پاسخ OCSP همراه گواهی را فعال می‌کنند. CA کوچک ما responder و AIA ندارد؛ در این آزمایش ادعای stapling موفق نمی‌کنیم. با openssl s_client -status حضور پاسخ را می‌توان بررسی کرد. اگر intermediate داری، گواهی سرویس و intermediateها را در ترتیب درست ارائه کن؛ ریشه معمولاً از trust store کلاینت می‌آید.

وقتی صفحه هنوز باز نمی‌شود#

Timeout را از خطای نام و خطای HTTP جدا کن. ss -lntp، لاگ journalctl -u apache2 و configtest سه شاهد متفاوت‌اند. برای برگشت، سایت آزمایشگاهی را با a2dissite lpic303 غیرفعال و پس از configtest reload کن.

مرجع تنظیمات: mod_ssl و mod_headers .