TLS در ورودی، مسیر تا backend را خودکار محافظت نمی‌کند. امشب backend دارای HTTPS می‌سازیم و بررسی CA و نام آن را در Apache الزامی می‌کنیم.

این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نام‌ها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.

محیط: app با نگاشت ریشهٔ شب بیست‌وچهارم؛ backend آزمایشگاهی روی همان VM؛ CA شب یازدهم.

گواهی مستقل backend#

با الگوی شب یازدهم، کلید و CSR جدا برای backend.example.test بساز و با همان CA، SAN همین نام و کاربرد serverAuth امضا کن. فقط backend.crt و backend.key را در ~/apache-lab/backend-keys وب‌سرور با مجوز کلید 600 قرار بده. CA خصوصی همچنان روی کلاینت می‌ماند. پوشهٔ جداگانهٔ ~/apache-lab/backend-tls فقط محتوای قابل انتشار دارد.

در همین پوشه، backend.py:

import ssl
from http.server import HTTPServer, SimpleHTTPRequestHandler

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain("../backend-keys/backend.crt", "../backend-keys/backend.key")
server = HTTPServer(("127.0.0.1", 8443), SimpleHTTPRequestHandler)
server.socket = context.wrap_socket(server.socket, server_side=True)
server.serve_forever()

فایل ثابت index.html بساز و برنامه را از همین پوشه اجرا کن. این HTTPServer فقط برای آزمایش است؛ کلیدها بیرون از پوشهٔ serveشده‌اند و نباید با URL قابل دریافت باشند.

روی وب‌سرور، /etc/hosts را با نگاشت 127.0.0.1 backend.example.test تکمیل کن. در app، نگاشت HTTP قبلی را با این بخش جایگزین کن:

SSLProxyEngine On
SSLProxyVerify require
SSLProxyVerifyDepth 2
SSLProxyCheckPeerName On
SSLProxyCheckPeerExpire On
SSLProxyCACertificateFile /etc/apache-lab/tls/ca.crt
ProxyPass / https://backend.example.test:8443/
ProxyPassReverse / https://backend.example.test:8443/

نام URL باید با SAN گواهی تطبیق کند؛ IP loopback جای نام گواهی را نمی‌گیرد.

آزمون منفی واقعی#

ابتدا مستقیم با CA معتبر به backend و سپس از HTTPS عمومی app درخواست بده. برای آزمون نام، URL ProxyPass را موقتاً به https://127.0.0.1:8443/ تغییر بده؛ باید پاسخ ناموفق و خطای بررسی گواهی در لاگ داشته باشی. SSLProxyVerify none یا خاموش کردن PeerName راه رفع این خطا نیست.

بازگشت: config HTTP سالم شب بیست‌وچهارم را بازیابی و backend TLS را متوقف کن. برای backend دوردست، firewall، DNS و چرخهٔ تمدید گواهی نیز بخشی از قرارداد ارتباط‌اند.

منبع: تنظیم‌های SSLProxy در mod_ssl ، SSLContext در Python .