Cấu hình Kestrel và Triển khai HTTPS Tùy chỉnh trên .NET 6

Tổng quan về HTTPS trong ASP.NET Core

Trong hệ sinh thái ASP.NET Core, giao thức HTTPS được kích hoạt mặc định để đảm bảo an toàn truyền tải dữ liệu. Việc duy trì HTTPS vẫn có giá trị ngay cả khi ứng dụng chạy nội bộ sau firewall hoặc dưới dạng background service. Cơ chế tải chứng chỉ bảo mật khác nhau tùy theo hệ điều hành: Windows thường sử dụng Certificate Store tích hợp, trong khi Linux và macOS ưu tiên tải từ tệp tin chứng chỉ riêng biệt. Cách tiếp cận dựa trên tệp tin mang lại sự linh hoạt cao hơn, đặc biệt phù hợp cho các môi trường container hóa.

Hiểu về Kestrel Server

Kestrel là máy chủ HTTP đa nền tảng được xây dựng riêng cho ASP.NET Core, thay thế cho mô hình IIS truyền thống của .NET Framework. Ban đầu, Kestrel dựa trên thư viện libuv (tương tự Node.js), nhưng các phiên bản hiện đại đã chuyển sang sử dụng .NET Sockets thuần túy để tối ưu hiệu năng và khả năng kiểm soát.

Trong kiến trúc triển khai thực tế, Kestrel thường không tiếp xúc trực tiếp với internet. Các máy chủ web như IIS (trên Windows) hoặc Nginx (trên Linux) đóng vai trò là Reverse Proxy, nhận yêu cầu từ client và chuyển tiếp đến Kestrel. Tuy nhiên, việc cấu hình trực tiếp HTTPS trên Kestrel vẫn cần thiết cho các scenario chạy độc lập hoặc trong Docker.

Hướng dẫn cấu hình Kestrel

Để thực hành, chúng ta khởi tạo một dự án ASP.NET Core MVC mới thông qua command line:

dotnet new mvc -n KestrelDemo -o KestrelDemo
cd KestrelDemo

Tại phiên bản .NET 6, mô hình hosting đã được đơn giản hóa. Thay vì sử dụng Host.CreateDefaultBuilder như các phiên bản trước, chúng ta làm việc trực tiếp với WebApplication. Dưới đây là cách tùy chỉnh máy chủ Kestrel để lắng nghe trên nhiều cổng khác nhau:

var appBuilder = WebApplication.CreateBuilder(args);

appBuilder.WebHost.UseKestrel(serverConfig =>
{
    // Cấu hình cổng HTTP thường
    serverConfig.ListenAnyIP(8080);
    
    // Cấu hình cổng HTTPS với chứng chỉ
    serverConfig.ListenAnyIP(8081, secureOptions =>
    {
        secureOptions.UseHttps("dev_cert.pfx", "MyStrongPassword");
    });
});

var app = appBuilder.Build();
// ... cấu hình middleware
app.Run();

Đoạn mã trên thiết lập ứng dụng lắng nghe trên tất cả địa chỉ IP. Cổng 8080 dành cho traffic không mã hóa, trong khi cổng 8081 yêu cầu kết nối HTTPS hợp lệ thông qua tệp PFX.

Quản lý Chứng chỉ Bảo mật

Để cấu hình HTTPS hoạt động, bạn cần tạo hoặc xuất một chứng chỉ định dạng .pfx. Trên Windows, bạn có thể xuất chứng chỉ phát triển từ Certmgr.msc:

  1. Mở Certificate Manager và tìm chứng chỉ trong Personal Store.
  2. Chuột phải chọn chứng chỉ, vào All Tasks > Export.
  3. Trong wizard, chọn tùy chọn xuất kèm Private Key.
  4. Chọn định dạng Personal Information Exchange (.pfx).
  5. Thiết lập mật khẩu bảo vệ tệp tin (phải khớp với mật khẩu trong code).
  6. Lưu tệp vào thư mục gốc của dự án.

Lưu ý bảo mật: Trong môi trường production, tuyệt đối không hardcode mật khẩu chứng chỉ vào source code. Hãy sử dụng User Secrets, Azure Key Vault hoặc các biến môi trường để quản lý thông tin nhạy cảm này.

Kịch bản sử dụng thực tế

Việc cấu hình thủ công chứng chỉ trên Kestrel phù hợp nhất cho các ứng dụng chạy trong container Docker hoặc môi trường không có Reverse Proxy. Khi triển khai trên IIS hoặc Nginx, lớp proxy ngoài thường đảm nhiệm việc terminate SSL, khi đó ASP.NET Core chỉ cần lắng nghe HTTP nội bộ. Tuy nhiên, hiểu rõ cơ chế cấu hình Kestrel giúp developer chủ động hơn trong các kiến trúc microservice hoặc serverless.

Thẻ: dotnet-6 kestrel-server https-configuration aspnet-core ssl-certificate

Đăng vào ngày 4 tháng 7 lúc 18:55