انجیناکس؛ شب ۲۴: TLS معتبر تا backend
فهرست نوشته
TLS ورودی مسیر تا backend را خودکار محافظت نمیکند. امشب ارتباط HTTPS داخلی را با بررسی نام و CA فعال میکنیم و شکست هویت را بهصورت عمدی آزمایش میکنیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: app با نگاشت ریشه، CA lab، backend TLS محلی روی 8443. این شاخه پس از تمرین به HTTP سالم برمیگردد.
backend دارای نام#
با الگوی شب یازدهم کلید و گواهی مستقل برای backend.nginx.test با SAN همین نام و serverAuth بساز. کلیدها در ~/nginx-lab/backend-keys با مجوز مناسب و محتوای قابل انتشار در پوشهٔ جدا backend-tls قرار بگیرند.
در backend-tls فایل backend.py:
import ssl
from http.server import HTTPServer, SimpleHTTPRequestHandler
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain("../backend-keys/backend.crt", "../backend-keys/backend.key")
srv = HTTPServer(("127.0.0.1", 8443), SimpleHTTPRequestHandler)
srv.socket = ctx.wrap_socket(srv.socket, server_side=True)
srv.serve_forever()
یک index.html بساز و از همان پوشه اجرا کن؛ فایل خصوصی زیر مسیر serveشده نیست. روی وبسرور backend.nginx.test را به 127.0.0.1 نگاشت کن. location ریشهٔ app:
proxy_pass https://backend.nginx.test:8443;
proxy_ssl_server_name on;
proxy_ssl_name backend.nginx.test;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_trusted_certificate /etc/nginx/tls/ca.crt;
هدرهای پایه و proxy_http_version قبلی حفظ میشوند. proxy_ssl_verify پیشفرض را فرض نکن؛ صریحاً on لازم است. SNI، نام بررسیشده و Host برنامه مفاهیم جدا هستند.
شاهد منفی#
ابتدا مستقیم با CA معتبر و سپس از app درخواست بده. proxy_ssl_name را موقتاً به نام نامعتبر تغییر بده؛ باید خطای بررسی گواهی و پاسخ 5xx ببینی. خاموش کردن verify راه رفع این خطا نیست.
بازگشت: config HTTP شب بیستودوم را بازیابی و backend TLS را متوقف کن. برای backend دوردست، چرخهٔ تمدید گواهی، DNS و firewall نیز بخشی از قرارداد اعتمادند.
منبع: proxy_ssl_verify ، SSLContext در Python .