HTTPS (Hypertext Transfer Protocol Secure) là một sự kết hợp giữa giao thức HTTP và giao thức bảo mật SSL hay TLS cho phép trao đổi thông tin một cách an toàn và bảo mật trên Internet. Hiện nay, việc chuyển đổi từ HTTP sang HTTPS dần trở nên đơn giản hơn, không tốn kém chi phí mà giúp bảo mật tốt hơn cho người dùng cũng như được ưu tiên trong SEO.

Điều đắn đo lớn nhất của không ít bạn khi chuyển sang HTTPS là tốc độ load site. Bản thân giao thức HTTPS chậm hơn HTTP, tiêu tốn tài nguyên để mã hóa kết nối giữa người dùng và Webserver.

Giờ đây, bạn không còn cần phải lo lắng về vấn đề này nữa. Bạn sẽ gần như không thấy sự khác biệt giữa việc sử dụng HTTPS và HTTP, vẫn đảm bảo bảo mật mà không ảnh hưởng đến tốc độ load của site.

Hướng dẫn cài đặt SSL miễn phí Let’s Encrypt hay SSL Comodo trên HocVPS đã áp dụng đầy đủ các phương pháp và đảm bảo tối ưu HTTPS. Bạn chỉ cần áp dụng theo hướng dẫn là OK.

Để đánh giá việc tối ưu HTTPS, bạn có thể kiểm tra tại  SSL Server Test của SSL Labs với kết quả A+ là tối ưu nhất.

Bài viết này sẽ đi sâu vào phân tích, giúp các bạn hiểu rõ hơn về các kỹ thuật áp dụng để tối ưu HTTPS trên Nginx với HTTP/2, SSL/TLS Cache Sessions, Cipher Suites, DH Parameters, HSTS và OCSP Stapling.

1. HTTP/2

HTTP/2 – Hypertext Transfer Protocol Version 2 là phiên bản chính thức tiếp theo của giao thức mạng HTTP nhằm cải thiện tốc độ truy cập webite, khắc phục nhược điểm của phiên bản trước đó HTTP 1.1 đã được sử dụng hơn 15 năm.

HTTP/2 mang lại nhiều lợi ích như giúp trang web tải nhanh hơn qua việc truyền tải dữ liệu ở dạng nhị phân, các kết nối có thời gian sống dài hơn, xử lý nhiều request một lúc nhằm hạn chế tình trạng nghẽn/từ chối truy cập đồng thời dữ liệu được mã hóa và bảo mật bởi giao thức SSL/TLS.

HTTP/2 được hỗ trợ từ Nginx phiên bản 1.9.5 trở lên. Để thiết lập kết nối HTTP/2, các bạn tham khảo hướng dẫn Kích hoạt HTTP/2 với Nginx nhé.

2. Vô hiệu hóa SSL

Trước khi ngạc nhiên với quyết định này, hãy để mình giải thích rõ hơn về SSL và TLS. TLS (Transport Layer Security) và SSL (Secure Sockets Layer) là 2 giao thức bảo mật khác nhau trong truyền tải dữ liệu. Trong đó, TLS được phát triển dựa trên giao thức SSL v3.0. Tuy vậy, do thói quen cũng như tiện lợi trong trao đổi, chúng ta vẫn gọi chung là SSL.

Bản thân SSL chứa nhiều điểm yếu và đã có nhiều cuộc tấn công qua giao thức này. Hiện tại, SSL được khuyến cáo không nên dùng mà thay thế dần bởi TLS. Theo thống kê, trình duyệt duy nhất không hỗ trợ TLS là IE 6. Vì vậy, bạn hoàn toàn an tâm khi thay thế giao thức SSL bằng TLS.

Phiên bản mới nhất của TLS là 1.2, bên cạnh đó vẫn còn 1 vài thư viện mã nguồn và trình duyệt sử dụng TLS 1.0. Để sử dụng, bạn chỉ cần thêm dòng sau vào trong cấu hình Nginx:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

3. TLS Cache Connection Session

Nhằm rút ngắn thời gian và tăng tốc độ load website, chúng ta có thể áp dụng kỹ thuật cache các thông tin kết nối. Phần lớn thời gian tốn thêm của SSL/TLS xảy ra trong giai đoạn thiết lập các kết nối ban đầu. Bằng việc cache các thông số của tác vụ này, bạn đã cải tiến rất nhiều cho các truy vấn sau đó.

Trên cấu hình Nginx bạn thêm đoạn sau:

ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;

Theo như tài liệu của Nginx, 1MB có thể lưu trữ 4.000 sessions. Như vậy, 50MB có thể cache được 200.000 sessions và tồn tại trong 1 ngày. Dung lượng cache và thời gian timeout cần linh hoạt tùy theo lưu lượng và tần suất truy cập của người dùng. Bên cạnh đó, Nginx đủ thông minh để không sử dụng toàn bộ RAM vào việc cache sessions dù cho bạn có set giá trị đó quá lớn.

4. Cipher Suites

Cipher Suites là phần khó nhằn nhất trong SSL/TLS. Đây chính là giai đoạn mã hóa thông tin được truyền tải. Có rất nhiều thuật toán được dùng để mã hóa trong Cipher Suites. Việc nghiên cứu và lựa chọn thuật toán phù hợp thực sự tốn rất nhiều thời gian và công sức. Vì vậy, mình đã lựa chọn ra hai thuật toán phù hợp bên dưới, các bạn có thể lựa chọn:

ssl_prefer_server_ciphers on; 
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

Thuật toán mã hóa càng mạnh thì tính bảo mật càng cao. Đồng thời, tài nguyên xử lý và mức độ tương thích của trình duyệt cũng yêu cầu cao hơn. Bạn có thể tham khảo các thuật toán sẵn có từ SSL Config Generator của Mozzila.

5. DH parameters

Để hiểu sâu hơn về DH parameters, các bạn có thể tham khảo tài liệu DHE handshake and dhparam.

Bạn cần khởi tạo file lưu trữ thông số DH 2048bit lưu tại /etc/nginx/ssl/. Thực tế, việc generate ngẫu nhiên DH parameters 2048 hay 4096 bit là đủ an toàn cho việc sử dụng (lưu ý Java6 không hỗ trợ DH Parameters lớn hơn 1024bit).

# mkdir /etc/nginx/ssl/
# openssl dhparam 2048 -out /etc/nginx/ssl/dhparam.pem

Thêm vào cấu hình Nginx

ssl_dhparam /etc/nginx/ssl/dhparam.pem;

6. HSTS

HTTP Strict Transport Security (STS hay HSTS) là một hệ thống bảo mật nâng cao, có tác dụng ép trình duyệt tương tác Webserver bằng giao thức HTTPS.

Thông thường, để chuyển từ HTTP sang HTTPS, chúng ta sẽ cấu hình Redirect URL trên Webserver. Khi người dùng gõ trên trình duyệt canhme.com, trình duyệt sẽ ngầm hiểu bạn đang muốn gửi HTTP Request đến Webserver. Khi nhận được, Webserver sẽ phản hồi và yêu cầu trình duyệt gửi lại bằng HTTPS Request. Do đó phải mất 2 lần gửi request thì kết nối HTTPS mới hình thành, gây tốn tài nguyên và thời gian. Bên cạnh đó, thực tế rất ít người dùng trực tiếp gõ đầy đủ https://canhme.com.

HSTS giúp cache trên trình duyệt. Sau khi cache, từ các truy cập sau, trình duyệt sẽ gửi thẳng HTTPS Request cho Webserver. Kích hoạt HSTS giúp giảm đáng kể thời gian load site. Bạn thêm phần sau vào cấu hình Nginx:

# Enable HSTS (cache 1 year)
add_header Strict-Transport-Security "max-age=31536000" always;

Trong đó, max-age tính bằng s và 31.536.000s tương đương 1 năm.

Để kích hoạt HSTS cho toàn bộ subdomain, bạn thêm phần sau vào cấu hình Nginx:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

7. OCSP stapling

Online Certificate Status Protocol (OCSP) là quá trình kiểm tra tính hợp lệ của chứng chỉ SSL. Khi người dùng truy cập trang web qua HTTPS, Webserver sẽ gửi certificate của nó tới trình duyệt, tuy vậy không có gì đảm bảo tính hợp lệ của chứng chỉ . Để chắc chắn, trình duyệt sẽ gửi thông tin kiểm tra tới bên phát hành chứng chỉ Certificate Authority.

Với cách thức hoạt động trên, mỗi một truy vấn HTTPS tương ứng một quá trình kiểm tra. Đây là một vấn đề lớn đối với website có lượng truy cập cao khi phải tiêu tốn quá nhiều tài nguyên cho việc kiểm tra, cũng như ảnh hưởng đến vấn đề bảo mật liên quan đến bên thứ 3 (CA).

Kỹ thuật OCSP Stapling được coi là giải pháp cho vấn đề này. Webserver sẽ thay thế trình duyệt kết nối đến OSCP để lấy thông tin về tính hợp lệ của chứng chỉ rồi lưu lại. Khi người dùng truy cập site, Webserver sẽ gửi chứng chỉ kèm thông tin về tính hợp lệ cho trình duyệt. Các bạn có thể hoàn toàn yên tâm khi mà thông tin OCSP gửi cho Webserver đã được ký bởi CA và không thể giả mạo từ phía Webserver.


Cấu hình OCSP Stapling trên Nginx

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/canhme_com/ssl-bundle.crt;
resolver 8.8.8.8 8.8.4.4;

Trong đó, ssl_trusted_certificate được tạo từ toàn bộ các certificate, bao gồm cả Root và Intermediates Certificates . Đối với Let’s Encrypt chính là file chain.pem. Bên cạnh đó, Resolver có thể thay đổi tùy thuộc vào điều kiện, bạn có thể sử dụng Google DNS hoặc OpenDNS.
Kiểm tra OCSP

# openssl s_client -connect canhme.com:443 -servername canhme.com -status

Nếu kết quả ở lần 2 hiển thị OCSP Response Status: successful (0x0) là thành công

Như vậy, các bạn đã hiểu rõ hơn về các kỹ thuật áp dụng để tối ưu bảo mật Nginx với HTTPS, vừa đảm bảo bảo mật mà cải thiện tốc đô load site. Với xu hướng hiện nay, làn sóng chuyển đổi sang HTTPS trở nên mạnh mẽ hơn bao giờ hết. Nếu có điều gì cần giải đáp, các bạn hãy để lại comment bên dưới.

Comment của bạn

Lưu ý: tất cả comment đều được kiểm duyệt cẩn thận! Nếu có code bạn hãy up lên pastebin.com rồi để lại link trong comment.