آپاچی؛ شب ۲۶: TLS معتبر میان Apache و backend
فهرست نوشته
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 .