Dùng HTTPS cho hoạt động phát triển cục bộ

Maud Nalpas
Maud Nalpas

Trong hầu hết các trường hợp, http://localhost hoạt động giống như HTTPS cho mục đích phát triển. Tuy nhiên, có một số trường hợp đặc biệt, chẳng hạn như tên máy chủ tuỳ chỉnh hoặc sử dụng cookie bảo mật trên nhiều trình duyệt mà bạn cần thiết lập rõ ràng để trang web phát triển của mình hoạt động giống như HTTPS nhằm thể hiện chính xác cách trang web của bạn hoạt động trong môi trường thực tế. (Nếu trang web chính thức của bạn không sử dụng HTTPS, hãy ưu tiên chuyển sang HTTPS).

Trang này giải thích cách chạy trang web cục bộ bằng HTTPS.

Để biết hướng dẫn ngắn gọn, hãy xem tài liệu tham khảo nhanh về mkcert.**

Chạy trang web của bạn cục bộ bằng HTTPS thông qua mkcert (nên dùng)

Để sử dụng HTTPS với trang web phát triển cục bộ và truy cập vào https://localhost hoặc https://mysite.example (tên máy chủ tuỳ chỉnh), bạn cần có chứng chỉ TLS do một thực thể mà thiết bị và trình duyệt của bạn tin cậy ký, được gọi là tổ chức phát hành chứng chỉ (CA) đáng tin cậy. Trình duyệt sẽ kiểm tra xem chứng chỉ của máy chủ phát triển có được một CA đáng tin cậy ký hay không trước khi tạo kết nối HTTPS.

Bạn nên sử dụng mkcert (một CA trên nhiều nền tảng) để tạo và ký chứng chỉ. Để biết các tuỳ chọn hữu ích khác, hãy xem phần Chạy trang web của bạn cục bộ bằng HTTPS: các tuỳ chọn khác.

Nhiều hệ điều hành có các thư viện để tạo chứng chỉ, chẳng hạn như openssl. Tuy nhiên, các công cụ này phức tạp và kém đáng tin cậy hơn mkcert, đồng thời không nhất thiết phải đa nền tảng, khiến các nhóm nhà phát triển lớn khó tiếp cận hơn.

Thiết lập

  1. Cài đặt mkcert (chỉ một lần).

    Làm theo hướng dẫn để cài đặt mkcert trên hệ điều hành. Ví dụ: trên macOS:

    brew install mkcert
    brew install nss # if you use Firefox
    
  2. Thêm mkcert vào các CA gốc cục bộ.

    Trong dòng lệnh, hãy chạy lệnh sau:

    mkcert -install
    

    Thao tác này sẽ tạo ra một tổ chức phát hành chứng chỉ (CA) địa phương. Tổ chức phát hành chứng chỉ cục bộ do mkcert tạo chỉ được tin cậy cục bộ trên thiết bị của bạn.

  3. Tạo chứng chỉ cho trang web của bạn, có chữ ký của mkcert.

    Trong thiết bị đầu cuối, hãy chuyển đến thư mục gốc của trang web hoặc bất kỳ thư mục nào bạn muốn lưu trữ chứng chỉ.

    Sau đó, hãy chạy:

    mkcert localhost
    

    Nếu bạn đang sử dụng tên máy chủ tuỳ chỉnh như mysite.example, hãy chạy:

    mkcert mysite.example
    

    Lệnh này thực hiện hai việc:

    • Tạo chứng chỉ cho tên máy chủ mà bạn đã chỉ định.
    • Hãy để mkcert ký chứng chỉ.

    Chứng chỉ của bạn hiện đã sẵn sàng và được ký bởi một tổ chức phát hành chứng chỉ mà trình duyệt của bạn tin cậy trên máy.

  4. Định cấu hình máy chủ của bạn để sử dụng HTTPS bằng chứng chỉ TLS mà bạn vừa tạo.

    Thông tin chi tiết về cách thực hiện việc này sẽ phụ thuộc vào máy chủ của bạn. Sau đây là một số ví dụ:

    👩🏻 💻 Có nút:

    server.js (thay thế {PATH/TO/CERTIFICATE...}{PORT}):

    const https = require('https');
    const fs = require('fs');
    const options = {
      key: fs.readFileSync('{PATH/TO/CERTIFICATE-KEY-FILENAME}.pem'),
      cert: fs.readFileSync('{PATH/TO/CERTIFICATE-FILENAME}.pem'),
    };
    https
      .createServer(options, function (req, res) {
        // server code
      })
      .listen({PORT});
    

    👩🏻‍💻 Với http-server:

    Khởi động máy chủ như sau (thay thế {PATH/TO/CERTIFICATE...}):

    http-server -S -C {PATH/TO/CERTIFICATE-FILENAME}.pem -K {PATH/TO/CERTIFICATE-KEY-FILENAME}.pem
    

    -S chạy máy chủ của bạn bằng HTTPS, trong khi -C đặt chứng chỉ và -K đặt khoá.

    👩🏻‍💻 Với máy chủ phát triển React:

    Chỉnh sửa package.json như sau và thay thế {PATH/TO/CERTIFICATE...}:

    "scripts": {
    "start": "HTTPS=true SSL_CRT_FILE={PATH/TO/CERTIFICATE-FILENAME}.pem SSL_KEY_FILE={PATH/TO/CERTIFICATE-KEY-FILENAME}.pem react-scripts start"
    

    Ví dụ: nếu bạn đã tạo chứng chỉ cho localhost trong thư mục gốc của trang web:

    |-- my-react-app
        |-- package.json
        |-- localhost.pem
        |-- localhost-key.pem
        |--...
    

    Sau đó, tập lệnh start sẽ có dạng như sau:

    "scripts": {
        "start": "HTTPS=true SSL_CRT_FILE=localhost.pem SSL_KEY_FILE=localhost-key.pem react-scripts start"
    

    👩🏻‍💻 Các ví dụ khác:

  5. Hãy mở https://localhost hoặc https://mysite.example trong trình duyệt để kiểm tra kỹ xem bạn có đang chạy trang web cục bộ bằng HTTPS hay không. Bạn sẽ không thấy bất kỳ cảnh báo trình duyệt nào vì trình duyệt của bạn tin tưởng mkcert là một cơ quan chứng chỉ cục bộ.

Tài liệu tham khảo nhanh về mkcert

Tài liệu tham khảo nhanh về mkcert

Cách chạy trang web phát triển cục bộ bằng HTTPS:

  1. Thiết lập mkcert.

    Nếu bạn chưa cài đặt, hãy cài đặt mkcert, ví dụ: trên macOS:

    brew install mkcert

    Hãy xem phần cài đặt mkcert để biết hướng dẫn dành cho Windows và Linux.

    Sau đó, hãy tạo một tổ chức phát hành chứng chỉ cục bộ:

    mkcert -install
  2. Tạo chứng chỉ đáng tin cậy.

    mkcert {YOUR HOSTNAME e.g. localhost or mysite.example}

    Thao tác này sẽ tạo một chứng chỉ hợp lệ mà mkcert sẽ tự động ký.

  3. Định cấu hình máy chủ phát triển để sử dụng HTTPS và chứng chỉ mà bạn đã tạo ở Bước 2.

Giờ đây, bạn có thể truy cập vào https://{YOUR HOSTNAME} trong trình duyệt mà không gặp cảnh báo

</div>

Chạy trang web trên máy cục bộ bằng HTTPS: các tuỳ chọn khác

Sau đây là các cách khác để thiết lập chứng chỉ. Các thao tác này thường phức tạp hoặc rủi ro hơn so với sử dụng mkcert.

Chứng chỉ tự ký

Bạn cũng có thể quyết định không sử dụng tổ chức phát hành chứng chỉ cục bộ như mkcert mà thay vào đó là tự ký chứng chỉ của mình. Phương pháp này có một số bẫy:

  • Trình duyệt không tin tưởng bạn là một tổ chức phát hành chứng chỉ, vì vậy, trình duyệt sẽ hiển thị cảnh báo mà bạn cần bỏ qua theo cách thủ công. Trong Chrome, bạn có thể sử dụng cờ #allow-insecure-localhost để tự động bỏ qua cảnh báo này trên localhost.
  • Việc này không an toàn nếu bạn đang làm việc trong một mạng không an toàn.
  • Cách này không nhất thiết dễ dàng hoặc nhanh hơn so với việc sử dụng CA cục bộ như mkcert.
  • Chứng chỉ tự ký sẽ không hoạt động giống hệt như chứng chỉ đáng tin cậy.
  • Nếu không sử dụng kỹ thuật này trong ngữ cảnh trình duyệt, bạn cần tắt tính năng xác minh chứng chỉ cho máy chủ của mình. Việc quên bật lại tính năng này trong môi trường phát hành công khai sẽ gây ra vấn đề bảo mật.
Ảnh chụp màn hình cảnh báo mà trình duyệt sẽ hiển thị khi người dùng sử dụng chứng chỉ tự ký.
Cảnh báo mà trình duyệt sẽ hiển thị khi chứng chỉ tự ký được sử dụng.

Nếu bạn không chỉ định chứng chỉ, thì các tuỳ chọn HTTPS trên máy chủ phát triển của ReactVue sẽ tạo một chứng chỉ tự ký về nâng cao. Thao tác này nhanh chóng nhưng đi kèm với các cảnh báo trình duyệt tương tự và các vấn đề khác về chứng chỉ tự ký. May mắn là bạn có thể sử dụng tuỳ chọn HTTPS tích hợp sẵn trong khung giao diện người dùng và chỉ định một chứng chỉ đáng tin cậy cục bộ được tạo bằng mkcert hoặc các chứng chỉ tương tự. Để biết thêm thông tin, hãy xem ví dụ về mkcert với React.

Tại sao trình duyệt không tin tưởng chứng chỉ tự ký?

Nếu bạn mở trang web đang chạy cục bộ trong trình duyệt bằng HTTPS, trình duyệt sẽ kiểm tra chứng chỉ của máy chủ phát triển cục bộ. Khi thấy bạn đã tự ký chứng chỉ, hệ thống sẽ kiểm tra xem bạn đã được đăng ký là tổ chức phát hành chứng chỉ đáng tin cậy hay chưa. Vì bạn không phải là trình duyệt, nên trình duyệt của bạn không thể tin cậy chứng chỉ này và trình duyệt sẽ hiển thị cảnh báo cho biết kết nối của bạn không an toàn. Thao tác này vẫn tạo kết nối HTTPS nếu bạn tiếp tục, nhưng bạn tự chịu rủi ro khi làm như vậy.

Lý do khiến các trình duyệt không tin tưởng chứng chỉ tự ký: một sơ đồ.
Lý do trình duyệt không tin cậy chứng chỉ tự ký.

Chứng chỉ do một tổ chức phát hành chứng chỉ thông thường ký

Bạn cũng có thể sử dụng chứng chỉ do CA chính thức ký. Ứng dụng này có các chức năng sau:

  • Bạn sẽ phải thiết lập nhiều hơn so với khi sử dụng kỹ thuật CA cục bộ như mkcert.
  • Bạn cần sử dụng một tên miền hợp lệ mà bạn kiểm soát. Điều này có nghĩa là bạn không thể sử dụng các CA chính thức cho những mục sau:

Đảo ngược proxy

Một cách khác để truy cập vào trang web chạy cục bộ bằng HTTPS là sử dụng proxy đảo ngược, chẳng hạn như ngrok. Việc này có các rủi ro sau:

  • Bất kỳ ai được bạn chia sẻ URL proxy ngược đều có thể truy cập vào trang web phát triển cục bộ của bạn. Điều này có thể hữu ích khi bạn giới thiệu dự án của mình cho khách hàng, nhưng cũng có thể cho phép những người không được phép chia sẻ thông tin nhạy cảm.
  • Một số dịch vụ proxy ngược tính phí sử dụng, vì vậy, giá có thể là một yếu tố ảnh hưởng đến việc bạn chọn dịch vụ.
  • Các biện pháp bảo mật mới trong trình duyệt có thể ảnh hưởng đến cách hoạt động của các công cụ này.

Nếu đang sử dụng tên máy chủ tuỳ chỉnh như mysite.example trong Chrome, bạn có thể sử dụng một cờ để buộc trình duyệt coi mysite.example là an toàn. Tránh làm như vậy vì những lý do sau:

  • Bạn cần chắc chắn 100% rằng mysite.example luôn phân giải đến một địa chỉ cục bộ. Nếu không, bạn có nguy cơ rò rỉ thông tin xác thực chính thức.
  • Cờ này chỉ hoạt động trong Chrome, vì vậy, bạn không thể gỡ lỗi trên nhiều trình duyệt.

Xin cảm ơn tất cả những người xem xét và đóng góp ý kiến phản hồi, đặc biệt là Ryan Sleevi, Filippo Valsorda, Milica Mihajlija và Rowan Merewood. 🙌

Phông nền hình ảnh chính của @anandu trên Unsplash, đã chỉnh sửa.