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 .