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. Để kích hoạt HTTP/2, bạn chỉ cần sửa phần cấu hình SSL trong Nginx server như sau:

listen   443 ssl http2;

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.

26 Comments

  1. long 3 comment

    cho mình cái này sửa trong file cấu hình domain hay là file cấu hình nginx nginx.conf

    1. Việt Phương Moderator

      Cấu hình Nginx của domain bạn à, /etc/nginx/conf.d/domain.conf đó

    1. Việt Phương Moderator

      A+ thì không cần bạn à. Và mình nghĩ bạn cũng áp dụng các phương pháp liệt kê trong bài chứ?

      1. van minh 29 comment

        Mình thực hiện theo các bước ở trong bài https://hocvps.com/cai-dat-lets-encrypt/.
        Trong đó có phần http2 rồi, còn các phần khác trong bài này mình chưa làm theo. Không biết nên thực hiện không vì bài viết nói TLS bảo mật hơn SSL và cache được giao thức nữa.

        1. Việt Phương Moderator

          À bài viết ý mình đã áp dụng đầy đủ các phương pháp rồi. Bài viết này chỉ có tác dụng giải đáp các phương pháp mình sử dụng, cho user hiểu thêm thôi.

  2. CươngPjh 22 comment

    Cái này em vừa mới phải mần hôm trước để https lên A+ xong, làm được rồi mò vào mới thấy bài của đại ca =)) giá như có thể gặp nhau sớm hơn :))

    1. Việt Phương Moderator

      Bài Let’s Encrypt được A+ mà bạn. Bạn paste cấu hình Nginx conf qua đây mình xem cho (paste qua https://pastebin.com/ cho gọn).
      Bài viết này chỉ nhằm giải thích sâu hơn các kỹ thuật áp dụng tối ưu HTTPS. Còn bài Let’s Encrypt đã áp dụng toàn bộ rồi

        1. Việt Phương Moderator

          Bạn để SSL vào sai chỗ rồi
          1. Block 80 bạn bỏ SSL đi
          2. Block 443 thứ 2 bạn thêm SSL vào

  3. Nam Duong 1 comment

    Mình cài HTTPS cho trang web. Giờ vào googlechome báo lỗi : Trang web thể tạm thời không hoạt động hay được chuyển vĩnh viễn sang địa chỉ web mới.
    ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY
    Bạn có thể chỉ giúp mình cách sửa với.
    Xin cảm ơn!

    1. Việt Phương Moderator

      Gửi cho mình nội dung file Nginx conf domain của bạn. Và kết quả nginx -t là gì?
      Paste qua pastebin.com cho gọn

  4. Trường 11 comment

    Lúc trước cài theo bài let’s encrypt, kiểm tra theo link trên điểm B. Phần Key Exchange khoản 70 điểm.
    Vậy có nên làm theo bài này ko Ad?

    1. Việt Phương Moderator

      Bài Let’s Encrypt trên HocVPS là áp dụng luôn bài này mà bạn (bỏ mỗi OCSP Stapling). Nên luôn A+ chứ. Bạn paste mình Nginx Conf mình xem cho(paste qua http://pastebin.com/ cho gọn)

        1. Việt Phương Moderator

          Vừa kiểm tra xong. Bạn dùng 1 cert Let’s Encrypt cho nhiều site vậy. Sao không chia nhiều cert cho dễ quản lý. Kể cả cấu hình WordPress Multisite cũng vẫn có thể chia nhiều cert.
          Nhưng cái mình đoán bạn bị A là vì không kích hoạt HSTS với ssl_session_cache

          1. Trường 11 comment

            Mình vừa chèn add_header Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”; vào nginx thì A+ rồi.
            Sau lúc trước trong bài viết không có hướng dẫn đoạn này bạn ?

          2. Việt Phương Moderator

            Có mà bạn. HSTS đều có trong hướng dẫn của Let’s Encrypt và Comodo. Bạn để hẳn 2 năm à 🙂 Chú ý phải để site luôn hoạt động ở SSL nhé, do đã lưu HSTS tức sẽ luôn force SSL dù cấu hình không cài đặt SSL

  5. loi 3 comment

    khoong hieu cach cai OCSP stapling nhu the nao, xin chi ro hon di admin, xin cam on admin nhieu

    1. Việt Phương Moderator

      Bạn thêm phần cấu hình OCSP Stapling ngay dưới cấu hình SSL trong Nginx Conf của domain là được bạn nhé

Comment của bạn

Your email address will not be published. Required fields are marked *